<!DOCTYPE html>
<html lang="en-US" dir="ltr">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>团队开发规范 | VitePress</title>
    <meta name="description" content="A VitePress site">
    <link rel="preload stylesheet" href="/notebook/assets/style.3dbfd0c2.css" as="style">
    
    <script type="module" src="/notebook/assets/app.8aaa4cbe.js"></script>
    <link rel="preload" href="/notebook/assets/inter-roman-latin.2ed14f66.woff2" as="font" type="font/woff2" crossorigin="">
    <link rel="modulepreload" href="/notebook/assets/chunks/framework.1336c4e5.js">
    <link rel="modulepreload" href="/notebook/assets/chunks/theme.20cddc0c.js">
    <link rel="modulepreload" href="/notebook/assets/2、数据库_MySQL_MySQL核心_设计.md.7faf46d1.lean.js">
    <script id="check-dark-light">(()=>{const e=localStorage.getItem("vitepress-theme-appearance")||"",a=window.matchMedia("(prefers-color-scheme: dark)").matches;(!e||e==="auto"?a:e==="dark")&&document.documentElement.classList.add("dark")})();</script>
  </head>
  <body>
    <div id="app"><div class="Layout" data-v-255ec12d><!--[--><!--]--><!--[--><span tabindex="-1" data-v-ae3e3f51></span><a href="#VPContent" class="VPSkipLink visually-hidden" data-v-ae3e3f51> Skip to content </a><!--]--><!----><header class="VPNav" data-v-255ec12d data-v-7e5bc4a5><div class="VPNavBar has-sidebar" data-v-7e5bc4a5 data-v-0937f67c><div class="container" data-v-0937f67c><div class="title" data-v-0937f67c><div class="VPNavBarTitle has-sidebar" data-v-0937f67c data-v-86d1bed8><a class="title" href="/notebook/" data-v-86d1bed8><!--[--><!--]--><!--[--><img class="VPImage logo" src="/notebook/Vue.png" alt data-v-8426fc1a><!--]--><!--[-->任硕的文档<!--]--><!--[--><!--]--></a></div></div><div class="content" data-v-0937f67c><div class="curtain" data-v-0937f67c></div><div class="content-body" data-v-0937f67c><!--[--><!--]--><div class="VPNavBarSearch search" style="--vp-meta-key:&#39;Meta&#39;;" data-v-0937f67c><!--[--><!----><div id="docsearch"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><svg class="DocSearch-Search-Icon" width="20" height="20" viewBox="0 0 20 20" aria-label="search icon"><path d="M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z" stroke="currentColor" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"></path></svg><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"><kbd class="DocSearch-Button-Key"></kbd><kbd class="DocSearch-Button-Key">K</kbd></span></button></div><!--]--></div><nav aria-labelledby="main-nav-aria-label" class="VPNavBarMenu menu" data-v-0937f67c data-v-7f418b0f><span id="main-nav-aria-label" class="visually-hidden" data-v-7f418b0f>Main Navigation</span><!--[--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-7f418b0f data-v-a7b5672a><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-a7b5672a><span class="text" data-v-a7b5672a><!----><span data-v-a7b5672a>Java学前端</span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="text-icon" data-v-a7b5672a><path d="M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"></path></svg></span></button><div class="menu" data-v-a7b5672a><div class="VPMenu" data-v-a7b5672a data-v-e7ea1737><div class="items" data-v-e7ea1737><!--[--><!--[--><div class="VPMenuGroup" data-v-e7ea1737 data-v-69e747b5><!----><!--[--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/Java%E5%AD%A6%E5%89%8D%E7%AB%AF/HTML+JS.html" data-v-2f2cfafc><!--[-->HTML+JS<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/Java%E5%AD%A6%E5%89%8D%E7%AB%AF/CSS.html" data-v-2f2cfafc><!--[-->CSS<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/Java%E5%AD%A6%E5%89%8D%E7%AB%AF/Vue2+%E7%BB%84%E4%BB%B6.html" data-v-2f2cfafc><!--[-->Vue2+组件<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/Java%E5%AD%A6%E5%89%8D%E7%AB%AF/Vue3+%E7%BB%84%E4%BB%B6.html" data-v-2f2cfafc><!--[-->Vue3+组件<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/Java%E5%AD%A6%E5%89%8D%E7%AB%AF/React.html" data-v-2f2cfafc><!--[-->React<!--]--></a></div><!--]--><!--]--></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-7f418b0f data-v-a7b5672a><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-a7b5672a><span class="text" data-v-a7b5672a><!----><span data-v-a7b5672a>软件测试</span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="text-icon" data-v-a7b5672a><path d="M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"></path></svg></span></button><div class="menu" data-v-a7b5672a><div class="VPMenu" data-v-a7b5672a data-v-e7ea1737><div class="items" data-v-e7ea1737><!--[--><!--[--><div class="VPMenuGroup" data-v-e7ea1737 data-v-69e747b5><!----><!--[--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95/%E6%B5%8B%E8%AF%95%E5%9F%BA%E7%A1%80.html" data-v-2f2cfafc><!--[-->测试基础<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95/%E5%8E%8B%E5%8A%9B%E6%B5%8B%E8%AF%95.html" data-v-2f2cfafc><!--[-->压力测试<!--]--></a></div><!--]--><!--]--></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-7f418b0f data-v-a7b5672a><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-a7b5672a><span class="text" data-v-a7b5672a><!----><span data-v-a7b5672a>多线程</span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="text-icon" data-v-a7b5672a><path d="M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"></path></svg></span></button><div class="menu" data-v-a7b5672a><div class="VPMenu" data-v-a7b5672a data-v-e7ea1737><div class="items" data-v-e7ea1737><!--[--><!--[--><div class="VPMenuGroup" data-v-e7ea1737 data-v-69e747b5><!----><!--[--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/%E5%B9%B6%E5%8F%91%20&amp;%20%E5%A4%9A%E7%BA%BF%E7%A8%8B/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-2f2cfafc><!--[-->基础篇<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/%E5%B9%B6%E5%8F%91%20&amp;%20%E5%A4%9A%E7%BA%BF%E7%A8%8B/%E5%B9%B6%E5%8F%91%E5%AE%8C%E5%96%84.html" data-v-2f2cfafc><!--[-->进阶篇<!--]--></a></div><!--]--><!--]--></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-7f418b0f data-v-a7b5672a><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-a7b5672a><span class="text" data-v-a7b5672a><!----><span data-v-a7b5672a>开发工具</span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="text-icon" data-v-a7b5672a><path d="M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"></path></svg></span></button><div class="menu" data-v-a7b5672a><div class="VPMenu" data-v-a7b5672a data-v-e7ea1737><div class="items" data-v-e7ea1737><!--[--><!--[--><div class="VPMenuGroup" data-v-e7ea1737 data-v-69e747b5><!----><!--[--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/IDEA/Chrome.html" data-v-2f2cfafc><!--[-->Chrome<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/IDEA/IDEA%E5%9F%BA%E7%A1%80.html" data-v-2f2cfafc><!--[-->IDEA基础<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/IDEA/IDEA%E6%8F%92%E4%BB%B6.html" data-v-2f2cfafc><!--[-->IDEA插件<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/IDEA/VS%20Code.html" data-v-2f2cfafc><!--[-->VS Code<!--]--></a></div><!--]--><!--]--></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-7f418b0f data-v-a7b5672a><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-a7b5672a><span class="text" data-v-a7b5672a><!----><span data-v-a7b5672a>消息中间件</span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="text-icon" data-v-a7b5672a><path d="M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"></path></svg></span></button><div class="menu" data-v-a7b5672a><div class="VPMenu" data-v-a7b5672a data-v-e7ea1737><div class="items" data-v-e7ea1737><!--[--><!--[--><div class="VPMenuGroup" data-v-e7ea1737 data-v-69e747b5><!----><!--[--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6/RabbitMQ.html" data-v-2f2cfafc><!--[-->RabbitMQ<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6/RocketMQ.html" data-v-2f2cfafc><!--[-->RocketMQ<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6/Kafka.html" data-v-2f2cfafc><!--[-->Kafka<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6/Canal.html" data-v-2f2cfafc><!--[-->Canal<!--]--></a></div><!--]--><!--]--></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--]--></nav><!----><div class="VPNavBarAppearance appearance" data-v-0937f67c data-v-f6a63727><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title="toggle dark mode" aria-checked="false" data-v-f6a63727 data-v-82b282f1 data-v-f3c41672><span class="check" data-v-f3c41672><span class="icon" data-v-f3c41672><!--[--><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="sun" data-v-82b282f1><path d="M12,18c-3.3,0-6-2.7-6-6s2.7-6,6-6s6,2.7,6,6S15.3,18,12,18zM12,8c-2.2,0-4,1.8-4,4c0,2.2,1.8,4,4,4c2.2,0,4-1.8,4-4C16,9.8,14.2,8,12,8z"></path><path d="M12,4c-0.6,0-1-0.4-1-1V1c0-0.6,0.4-1,1-1s1,0.4,1,1v2C13,3.6,12.6,4,12,4z"></path><path d="M12,24c-0.6,0-1-0.4-1-1v-2c0-0.6,0.4-1,1-1s1,0.4,1,1v2C13,23.6,12.6,24,12,24z"></path><path d="M5.6,6.6c-0.3,0-0.5-0.1-0.7-0.3L3.5,4.9c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l1.4,1.4c0.4,0.4,0.4,1,0,1.4C6.2,6.5,5.9,6.6,5.6,6.6z"></path><path d="M19.8,20.8c-0.3,0-0.5-0.1-0.7-0.3l-1.4-1.4c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l1.4,1.4c0.4,0.4,0.4,1,0,1.4C20.3,20.7,20,20.8,19.8,20.8z"></path><path d="M3,13H1c-0.6,0-1-0.4-1-1s0.4-1,1-1h2c0.6,0,1,0.4,1,1S3.6,13,3,13z"></path><path d="M23,13h-2c-0.6,0-1-0.4-1-1s0.4-1,1-1h2c0.6,0,1,0.4,1,1S23.6,13,23,13z"></path><path d="M4.2,20.8c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l1.4-1.4c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-1.4,1.4C4.7,20.7,4.5,20.8,4.2,20.8z"></path><path d="M18.4,6.6c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l1.4-1.4c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-1.4,1.4C18.9,6.5,18.6,6.6,18.4,6.6z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="moon" data-v-82b282f1><path d="M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"></path></svg><!--]--></span></span></button></div><div class="VPSocialLinks VPNavBarSocialLinks social-links" data-v-0937f67c data-v-0394ad82 data-v-7bc22406><!--[--><a class="VPSocialLink no-icon" href="https://github.com/renshuo123/renshuo123.github.io" aria-label="github" target="_blank" rel="noopener" data-v-7bc22406 data-v-f80f8133><svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>GitHub</title><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg></a><a class="VPSocialLink no-icon" href="#" aria-label="twitter" target="_blank" rel="noopener" data-v-7bc22406 data-v-f80f8133><svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Twitter</title><path d="M23.953 4.57a10 10 0 01-2.825.775 4.958 4.958 0 002.163-2.723c-.951.555-2.005.959-3.127 1.184a4.92 4.92 0 00-8.384 4.482C7.69 8.095 4.067 6.13 1.64 3.162a4.822 4.822 0 00-.666 2.475c0 1.71.87 3.213 2.188 4.096a4.904 4.904 0 01-2.228-.616v.06a4.923 4.923 0 003.946 4.827 4.996 4.996 0 01-2.212.085 4.936 4.936 0 004.604 3.417 9.867 9.867 0 01-6.102 2.105c-.39 0-.779-.023-1.17-.067a13.995 13.995 0 007.557 2.209c9.053 0 13.998-7.496 13.998-13.985 0-.21 0-.42-.015-.63A9.935 9.935 0 0024 4.59z"/></svg></a><a class="VPSocialLink no-icon" href="https://github.com/" aria-label target="_blank" rel="noopener" data-v-7bc22406 data-v-f80f8133><svg t="1676028692954" class="icon" ...</path></svg></a><!--]--></div><div class="VPFlyout VPNavBarExtra extra" data-v-0937f67c data-v-40855f84 data-v-a7b5672a><button type="button" class="button" aria-haspopup="true" aria-expanded="false" aria-label="extra navigation" data-v-a7b5672a><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="icon" data-v-a7b5672a><circle cx="12" cy="12" r="2"></circle><circle cx="19" cy="12" r="2"></circle><circle cx="5" cy="12" r="2"></circle></svg></button><div class="menu" data-v-a7b5672a><div class="VPMenu" data-v-a7b5672a data-v-e7ea1737><!----><!--[--><!--[--><!----><div class="group" data-v-40855f84><div class="item appearance" data-v-40855f84><p class="label" data-v-40855f84>Appearance</p><div class="appearance-action" data-v-40855f84><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title="toggle dark mode" aria-checked="false" data-v-40855f84 data-v-82b282f1 data-v-f3c41672><span class="check" data-v-f3c41672><span class="icon" data-v-f3c41672><!--[--><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="sun" data-v-82b282f1><path d="M12,18c-3.3,0-6-2.7-6-6s2.7-6,6-6s6,2.7,6,6S15.3,18,12,18zM12,8c-2.2,0-4,1.8-4,4c0,2.2,1.8,4,4,4c2.2,0,4-1.8,4-4C16,9.8,14.2,8,12,8z"></path><path d="M12,4c-0.6,0-1-0.4-1-1V1c0-0.6,0.4-1,1-1s1,0.4,1,1v2C13,3.6,12.6,4,12,4z"></path><path d="M12,24c-0.6,0-1-0.4-1-1v-2c0-0.6,0.4-1,1-1s1,0.4,1,1v2C13,23.6,12.6,24,12,24z"></path><path d="M5.6,6.6c-0.3,0-0.5-0.1-0.7-0.3L3.5,4.9c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l1.4,1.4c0.4,0.4,0.4,1,0,1.4C6.2,6.5,5.9,6.6,5.6,6.6z"></path><path d="M19.8,20.8c-0.3,0-0.5-0.1-0.7-0.3l-1.4-1.4c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l1.4,1.4c0.4,0.4,0.4,1,0,1.4C20.3,20.7,20,20.8,19.8,20.8z"></path><path d="M3,13H1c-0.6,0-1-0.4-1-1s0.4-1,1-1h2c0.6,0,1,0.4,1,1S3.6,13,3,13z"></path><path d="M23,13h-2c-0.6,0-1-0.4-1-1s0.4-1,1-1h2c0.6,0,1,0.4,1,1S23.6,13,23,13z"></path><path d="M4.2,20.8c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l1.4-1.4c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-1.4,1.4C4.7,20.7,4.5,20.8,4.2,20.8z"></path><path d="M18.4,6.6c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l1.4-1.4c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-1.4,1.4C18.9,6.5,18.6,6.6,18.4,6.6z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="moon" data-v-82b282f1><path d="M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"></path></svg><!--]--></span></span></button></div></div></div><div class="group" data-v-40855f84><div class="item social-links" data-v-40855f84><div class="VPSocialLinks social-links-list" data-v-40855f84 data-v-7bc22406><!--[--><a class="VPSocialLink no-icon" href="https://github.com/renshuo123/renshuo123.github.io" aria-label="github" target="_blank" rel="noopener" data-v-7bc22406 data-v-f80f8133><svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>GitHub</title><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg></a><a class="VPSocialLink no-icon" href="#" aria-label="twitter" target="_blank" rel="noopener" data-v-7bc22406 data-v-f80f8133><svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Twitter</title><path d="M23.953 4.57a10 10 0 01-2.825.775 4.958 4.958 0 002.163-2.723c-.951.555-2.005.959-3.127 1.184a4.92 4.92 0 00-8.384 4.482C7.69 8.095 4.067 6.13 1.64 3.162a4.822 4.822 0 00-.666 2.475c0 1.71.87 3.213 2.188 4.096a4.904 4.904 0 01-2.228-.616v.06a4.923 4.923 0 003.946 4.827 4.996 4.996 0 01-2.212.085 4.936 4.936 0 004.604 3.417 9.867 9.867 0 01-6.102 2.105c-.39 0-.779-.023-1.17-.067a13.995 13.995 0 007.557 2.209c9.053 0 13.998-7.496 13.998-13.985 0-.21 0-.42-.015-.63A9.935 9.935 0 0024 4.59z"/></svg></a><a class="VPSocialLink no-icon" href="https://github.com/" aria-label target="_blank" rel="noopener" data-v-7bc22406 data-v-f80f8133><svg t="1676028692954" class="icon" ...</path></svg></a><!--]--></div></div></div><!--]--><!--]--></div></div></div><!--[--><!--]--><button type="button" class="VPNavBarHamburger hamburger" aria-label="mobile navigation" aria-expanded="false" aria-controls="VPNavScreen" data-v-0937f67c data-v-e5dd9c1c><span class="container" data-v-e5dd9c1c><span class="top" data-v-e5dd9c1c></span><span class="middle" data-v-e5dd9c1c></span><span class="bottom" data-v-e5dd9c1c></span></span></button></div></div></div></div><!----></header><div class="VPLocalNav reached-top" data-v-255ec12d data-v-5cfd5582><button class="menu" aria-expanded="false" aria-controls="VPSidebarNav" data-v-5cfd5582><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="menu-icon" data-v-5cfd5582><path d="M17,11H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,11,17,11z"></path><path d="M21,7H3C2.4,7,2,6.6,2,6s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,7,21,7z"></path><path d="M21,15H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,15,21,15z"></path><path d="M17,19H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,19,17,19z"></path></svg><span class="menu-text" data-v-5cfd5582>Menu</span></button><div class="VPLocalNavOutlineDropdown" style="--vp-vh:0px;" data-v-5cfd5582 data-v-18201f51><button data-v-18201f51>Return to top</button><!----></div></div><aside class="VPSidebar" data-v-255ec12d data-v-845b8fc6><div class="curtain" data-v-845b8fc6></div><nav class="nav" id="VPSidebarNav" aria-labelledby="sidebar-aria-label" tabindex="-1" data-v-845b8fc6><span class="visually-hidden" id="sidebar-aria-label" data-v-845b8fc6> Sidebar Navigation </span><!--[--><!--]--><!--[--><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>Java</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Java/Java%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Java基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Java/Java%E6%96%B0%E7%89%B9%E6%80%A7.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Java新特性</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Java/Java%E8%BF%9B%E9%98%B6.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Java进阶</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Java/Java%E9%9B%86%E5%90%88.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Java集合</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Java/Java%E9%AB%98%E7%BA%A7.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Java高级</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>Linux</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Linux/Linux%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Linux基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Linux/Linux%E8%BF%9B%E9%98%B6.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Linux新特性</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Linux/Shell.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Shell脚本</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Linux/%E5%AE%9E%E7%94%A8%E8%84%9A%E6%9C%AC.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>实用脚本</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Linux/%E8%BD%AF%E4%BB%B6%E9%83%A8%E7%BD%B2.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>软件部署</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>Nginx</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Nginx/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>基础篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Nginx/%E8%BF%9B%E9%98%B6%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>进阶篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Nginx/%E5%AE%9E%E6%88%98%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>实战篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Nginx/%E9%9D%A2%E8%AF%95%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>面试篇</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>SSM</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/SSM/Maven.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Maven</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/SSM/Spring.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Spring</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/SSM/SpringMVC.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>SpringMVC</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/SSM/SpringBatch.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>SpringBatch</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>SpringBoot</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/3%E3%80%81SpringBoot/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>基础篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/3%E3%80%81SpringBoot/%E5%BA%94%E7%94%A8%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>应用篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/3%E3%80%81SpringBoot/%E6%96%B0%E7%89%B9%E6%80%A7.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>新特性</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/3%E3%80%81SpringBoot/%E8%BF%90%E7%BB%B4&amp;%E5%8E%9F%E7%90%86.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>运维&原理</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>SpringCloud</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/4%E3%80%81%E5%BE%AE%E6%9C%8D%E5%8A%A1/%E8%BF%9B%E9%98%B6.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>SpringCloud</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/4%E3%80%81%E5%BE%AE%E6%9C%8D%E5%8A%A1/%E5%BF%85%E5%A4%87/Sentinel.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Sentinel</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>SpringSecurity</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/4%E3%80%81%E5%BE%AE%E6%9C%8D%E5%8A%A1/SpringSecurity/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>SpringSecurity基础篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/4%E3%80%81%E5%BE%AE%E6%9C%8D%E5%8A%A1/SpringSecurity/%E8%BF%9B%E9%98%B6%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>SpringSecurity进阶篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/4%E3%80%81%E5%BE%AE%E6%9C%8D%E5%8A%A1/SpringSecurity/%E9%AB%98%E7%BA%A7%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>SpringSecurity高级篇</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>Mybatis & MybatisPlus</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Mybatis&amp;MybatisPlus/Mybatis.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Mybatis</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Mybatis&amp;MybatisPlus/MybatisPlus.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>MybatisPlus</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Mybatis&amp;MybatisPlus/JPA.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>JPA</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>Git & ChatGPT</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/5%E3%80%81%E8%BF%90%E7%BB%B4/Git.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Git</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/5%E3%80%81%E8%BF%90%E7%BB%B4/Github.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Github</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/5%E3%80%81%E8%BF%90%E7%BB%B4/ChatGPT.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>ChatGPT</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/5%E3%80%81%E8%BF%90%E7%BB%B4/Jenkins.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Jenkins</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/5%E3%80%81%E8%BF%90%E7%BB%B4/Netty.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Netty</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible has-active" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>数据库</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><section class="VPSidebarItem level-1 collapsible has-active" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>MySQL</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/MySQL/MySQL%E6%A0%B8%E5%BF%83/%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>MySQL基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/MySQL/MySQL%E6%A0%B8%E5%BF%83/%E8%BF%9B%E9%98%B6.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>MySQL进阶</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/MySQL/MySQL%E6%A0%B8%E5%BF%83/%E4%BC%98%E5%8C%96.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>MySQL优化</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/MySQL/MySQL%E6%A0%B8%E5%BF%83/%E8%AE%BE%E8%AE%A1.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>MySQL设计</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/MySQL/MySQL%E6%A0%B8%E5%BF%83/%E8%BF%90%E7%BB%B4.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>MySQL运维</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/MySQL/%E5%88%86%E5%BA%93%E5%88%86%E8%A1%A8.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>分库分表</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>Redis</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/Redis/Redis%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Redis基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/Redis/Redis%E4%BC%98%E5%8C%96.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Redis优化</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/Redis/Redis%E5%8E%9F%E7%90%86.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Redis原理</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/Redis/Redis%E9%AB%98%E7%BA%A7.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Redis高级</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/Redis/Redis%E5%AE%9E%E6%88%98.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Redis实战</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/Redis/%E6%9C%AC%E5%9C%B0%E7%BC%93%E5%AD%98.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>本地缓存</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>MongoDB</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/MongoDB/%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>MongoDB基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/MongoDB/%E6%95%B4%E5%90%88.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>MongoDB进阶</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>ElasticSearch</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/ElasticSearch/1%E3%80%81ES%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>ES基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/ElasticSearch/3%E3%80%81ES%E9%AB%98%E7%BA%A7.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>ES高级</p><!--]--></a><!----></div><!----></div><!--]--></div></section><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/influxdb.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>InfluxDB</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/Neo4j.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Neo4j</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>高并发 & 秒杀 & 分布式</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E4%B8%89%E9%AB%98/%E5%88%86%E5%B8%83%E5%BC%8F.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>分布式理论</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/4%E3%80%81%E5%BE%AE%E6%9C%8D%E5%8A%A1/%E5%BF%85%E5%A4%87/%E5%88%86%E5%B8%83%E5%BC%8F%E9%94%81.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>分布式锁</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E4%B8%89%E9%AB%98/%E7%A7%92%E6%9D%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>秒杀</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E4%B8%89%E9%AB%98/%E9%AB%98%E5%8F%AF%E7%94%A8.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>高可用</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E4%B8%89%E9%AB%98/%E9%AB%98%E5%B9%B6%E5%8F%91.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>高并发</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>云原生</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E4%BA%91%E5%8E%9F%E7%94%9F/Docker.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Docker</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E4%BA%91%E5%8E%9F%E7%94%9F/K8S.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>K8S</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>可视化 & 监控</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E5%8F%AF%E8%A7%86%E5%8C%96%20&amp;%20%E7%9B%91%E6%8E%A7/%E7%9B%91%E6%8E%A7%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>监控基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E5%8F%AF%E8%A7%86%E5%8C%96%20&amp;%20%E7%9B%91%E6%8E%A7/%E7%9B%91%E6%8E%A7%E8%BF%9B%E9%98%B6.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>监控进阶</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E5%8F%AF%E8%A7%86%E5%8C%96%20&amp;%20%E7%9B%91%E6%8E%A7/%E5%8F%AF%E8%A7%86%E5%8C%96%E5%A4%A7%E5%B1%8F.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>可视化大屏</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E5%8F%AF%E8%A7%86%E5%8C%96%20&amp;%20%E7%9B%91%E6%8E%A7/Zabbix.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Zabbix</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>学前端</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>HTML+CSS</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/1%E3%80%81HTML+CSS/HTML%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>HTML基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/1%E3%80%81HTML+CSS/CSS%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>CSS基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/1%E3%80%81HTML+CSS/%E7%BD%91%E9%A1%B5%E8%BF%9B%E9%98%B6.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>网页进阶</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>JS+TS</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/2%E3%80%81JS+TS/JS%20%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>JS基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/2%E3%80%81JS+TS/JS%20%E8%BF%9B%E9%98%B6.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>JS进阶</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/2%E3%80%81JS+TS/ES6%20%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>ES6基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/2%E3%80%81JS+TS/ES6%20%E8%BF%9B%E9%98%B6.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>ES6进阶</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/2%E3%80%81JS+TS/TypeScript.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>TS基础</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>NodeJS</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/4%E3%80%81Node/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Node基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/4%E3%80%81Node/%E8%BF%9B%E9%98%B6%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Node进阶</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/4%E3%80%81Node/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>项目实战</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>Vue</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/3%E3%80%81Vue/Vue3/Vue3%E8%BF%9B%E9%98%B6.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Vue3进阶</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/3%E3%80%81Vue/Vue3/Vue3%E9%AB%98%E7%BA%A7.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Vue3高级</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/3%E3%80%81Vue/Vue3/Vue3%E6%96%B0%E8%AF%AD%E6%B3%95.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Vue3新语法</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/3%E3%80%81Vue/Vue2/Vue2%E9%A1%B9%E7%9B%AE.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>项目实战</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>小程序</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/5%E3%80%81%E5%B0%8F%E7%A8%8B%E5%BA%8F/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>小程序基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/5%E3%80%81%E5%B0%8F%E7%A8%8B%E5%BA%8F/%E5%B0%8F%E7%A8%8B%E5%BA%8F%E4%BC%98%E5%8C%96.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>小程序优化</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/5%E3%80%81%E5%B0%8F%E7%A8%8B%E5%BA%8F/uniapp.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>uniapp</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/5%E3%80%81%E5%B0%8F%E7%A8%8B%E5%BA%8F/%E5%B0%8F%E7%A8%8B%E5%BA%8F%E9%A1%B9%E7%9B%AE.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>项目实战</p><!--]--></a><!----></div><!----></div><!--]--></div></section><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>计算机基础</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>数据结构</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>操作系统</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>设计模式</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E7%BD%91%E7%BB%9C%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>计算机网络</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/UML.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>UML</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/%E7%AE%97%E6%B3%95/LeetCode.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>LeetCode</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>项目实战</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>云尚办公</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E4%BA%91%E5%B0%9A%E5%8A%9E%E5%85%AC/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>基础篇</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>小兔鲜</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E5%B0%8F%E5%85%94%E9%B2%9C/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>基础篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E5%B0%8F%E5%85%94%E9%B2%9C/%E8%BF%9B%E9%98%B6%E7%AF%871.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>进阶篇1</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E5%B0%8F%E5%85%94%E9%B2%9C/%E8%BF%9B%E9%98%B6%E7%AF%872.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>进阶篇2</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>地图</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E7%99%BE%E5%BA%A6%E5%9C%B0%E5%9B%BE/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>基础篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E7%99%BE%E5%BA%A6%E5%9C%B0%E5%9B%BE/%E8%BF%9B%E9%98%B6%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>进阶篇</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>苍穹外卖</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E8%8B%8D%E7%A9%B9%E5%A4%96%E5%8D%96/%E8%BF%9B%E9%98%B6%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>进阶篇</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>黑马头条</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E9%BB%91%E9%A9%AC%E5%A4%B4%E6%9D%A1/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>基础篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E9%BB%91%E9%A9%AC%E5%A4%B4%E6%9D%A1/%E8%BF%9B%E9%98%B6%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>进阶篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E9%BB%91%E9%A9%AC%E5%A4%B4%E6%9D%A1/%E8%BF%9B%E9%98%B6%E7%AF%872.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>进阶篇2</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E9%BB%91%E9%A9%AC%E5%A4%B4%E6%9D%A1/%E9%AB%98%E7%BA%A7%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>高级篇</p><!--]--></a><!----></div><!----></div><!--]--></div></section><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E6%94%AF%E4%BB%98.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>支付</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E9%A1%B9%E7%9B%AE%E6%8E%A8%E8%8D%90.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>项目推荐</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0" data-v-845b8fc6 data-v-9b797284><!----><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/team.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>团队成员</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><!--]--><!--[--><!--]--></nav></aside><div class="VPContent has-sidebar" id="VPContent" data-v-255ec12d data-v-669faec9><div class="VPDoc has-sidebar has-aside" data-v-669faec9 data-v-6b87e69f><!--[--><!--]--><div class="container" data-v-6b87e69f><div class="aside" data-v-6b87e69f><div class="aside-curtain" data-v-6b87e69f></div><div class="aside-container" data-v-6b87e69f><div class="aside-content" data-v-6b87e69f><div class="VPDocAside" data-v-6b87e69f data-v-3f215769><!--[--><!--]--><!--[--><!--]--><div class="VPDocAsideOutline" data-v-3f215769 data-v-ff0f39c8><div class="content" data-v-ff0f39c8><div class="outline-marker" data-v-ff0f39c8></div><div class="outline-title" data-v-ff0f39c8>On this page</div><nav aria-labelledby="doc-outline-aria-label" data-v-ff0f39c8><span class="visually-hidden" id="doc-outline-aria-label" data-v-ff0f39c8> Table of Contents for current page </span><ul class="root" data-v-ff0f39c8 data-v-d0ee3533><!--[--><!--]--></ul></nav></div></div><!--[--><!--]--><div class="spacer" data-v-3f215769></div><!--[--><!--]--><!----><!--[--><!--]--><!--[--><!--]--></div></div></div></div><div class="content" data-v-6b87e69f><div class="content-container" data-v-6b87e69f><!--[--><!--]--><!----><main class="main" data-v-6b87e69f><div style="position:relative;" class="vp-doc _notebook_2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93_MySQL_MySQL%E6%A0%B8%E5%BF%83_%E8%AE%BE%E8%AE%A1" data-v-6b87e69f><div><h1 id="团队开发规范" tabindex="-1">团队开发规范 <a class="header-anchor" href="#团队开发规范" aria-label="Permalink to &quot;团队开发规范&quot;">​</a></h1><h2 id="数据库对象命名规范" tabindex="-1">数据库对象命名规范 <a class="header-anchor" href="#数据库对象命名规范" aria-label="Permalink to &quot;数据库对象命名规范&quot;">​</a></h2><h3 id="数据库对象" tabindex="-1">数据库对象 <a class="header-anchor" href="#数据库对象" aria-label="Permalink to &quot;数据库对象&quot;">​</a></h3><blockquote><p>数据库对象是数据库的组成部分，常见的有以下几种：**表（Table ）、索引（Index）、视图（View）、图表（Diagram）、缺省值（Default）、规则（Rule）、触发器（Trigger）、存储过程（Stored Procedure）、 用户（User）**等。</p></blockquote><blockquote><p>命名规范是指数据库对象如<strong>数据库（SCHEMA）、表（TABLE）、索引（INDEX）、约束（CONSTRAINTS）等</strong></p></blockquote><h3 id="数据库对象全局命名规范" tabindex="-1">数据库对象全局命名规范 <a class="header-anchor" href="#数据库对象全局命名规范" aria-label="Permalink to &quot;数据库对象全局命名规范&quot;">​</a></h3><blockquote><p>1、<strong>命名使用具有意义的英文词汇，词汇中间以下划线分隔</strong></p><p>2、<strong>命名只能使用英文字母、数字、下划线，以英文字母开头</strong></p><p>3、<strong>避免用MySQL的保留字如：backup、call、group等</strong></p><p>4、<strong>所有数据库对象使用小写字母</strong>，实际上MySQL中是可以设置大小写是否敏感的</p></blockquote><h3 id="数据库命名规范" tabindex="-1">数据库命名规范 <a class="header-anchor" href="#数据库命名规范" aria-label="Permalink to &quot;数据库命名规范&quot;">​</a></h3><blockquote><p>1、数据库命名尽量不超过30个字符。</p><p>2、<strong>数据库命名一般为项目名称+代表库含义的简写</strong>，比如IM项目的工作流数据库，可以是 im_flow。</p><p>3、<strong>数据库创建时必须添加默认字符集和校对规则子句。默认字符集为UTF8（已迁移dumbo的使用utf8mb4）</strong></p><p>4、<strong>命名应使用小写</strong></p></blockquote><h3 id="表命名规范" tabindex="-1">表命名规范 <a class="header-anchor" href="#表命名规范" aria-label="Permalink to &quot;表命名规范&quot;">​</a></h3><blockquote><p>1、<strong>常规表表名以t_开头，t代表table的意思，命名规则即 t + 模块（包含模块含义的简写）+ 表（包含表含义的简写），比如用户模块的教育信息表：t_user_eduinfo</strong></p></blockquote><blockquote><p>2、<strong>临时表</strong>（<strong>RD、QA或DBA同学用于数据临时处理的表</strong>），命名规则：<strong>temp前缀+模块+表+日期后缀</strong>：temp_user_eduinfo_20210719</p></blockquote><blockquote><p>3、<strong>备份表</strong>（<strong>用于保存和归档历史数据或者作为灾备恢复的数据</strong>）命名规则，<strong>bak前缀+模块+表+日期后缀</strong>：bak_user_eduinfo_20210719</p></blockquote><blockquote><p>4、<strong>同一个模块的表尽可能使用相同的前缀，表名称尽可能表达含义</strong></p></blockquote><blockquote><p>5、<strong>多个单词以下划线 _ 分隔</strong></p></blockquote><blockquote><p>6、<strong>常规表表名尽量不超过30个字符，temp表和bak表视情况而定，也尽量简短为宜，命名应使用小写</strong></p></blockquote><h3 id="字段命名规范" tabindex="-1">字段命名规范 <a class="header-anchor" href="#字段命名规范" aria-label="Permalink to &quot;字段命名规范&quot;">​</a></h3><blockquote><p>1、<strong>字段命名需要表示其实际含义的英文单词或简写，单词之间用下划线 _ 进行连接</strong>，如 service_ip、service_port</p><p>2、<strong>各表之间相同意义的字段必须同名，比如a表和b表都有创建时间，应该统一为create_time</strong>，不一致会很混乱</p><p>3、<strong>多个单词以下划线 _ 分隔</strong></p><p>4、<strong>字段名尽量不超过30个字符，命名应该使用小写</strong></p></blockquote><h3 id="索引命名规范" tabindex="-1">索引命名规范 <a class="header-anchor" href="#索引命名规范" aria-label="Permalink to &quot;索引命名规范&quot;">​</a></h3><blockquote><p>1、<strong>唯一索引使用uni + 字段名</strong> 来命名：create unique index uni_uid on t_user_basic(uid) 。</p><p>2、<strong>非唯一索引使用idx + 字段名</strong> 来命名：create index idx_uname_mobile on t_user_basic(uname,mobile) 。</p><p>3、<strong>多个单词以下划线 _ 分隔</strong>。</p><p>4、<strong>索引名尽量不超过50个字符，命名应该使用小写，组合索引的字段不宜太多</strong>，不然不利于查询效率的提升</p><p>5、<strong>多单词组成的列名，取尽可能代表意义的缩写</strong>，如 test_contact表member_id和friend_id上的组合索引：idx_mid_fid。</p><p>6、<strong>理解组合索引最左前缀原则，避免重复建设索引</strong>，如果建立了(a,b,c)，相当于建立了(a), (a,b), (a,b,c)。</p></blockquote><h3 id="视图命名规范" tabindex="-1">视图命名规范 <a class="header-anchor" href="#视图命名规范" aria-label="Permalink to &quot;视图命名规范&quot;">​</a></h3><blockquote><p>1、<strong>视图名以v开头，表示view，完整结构是v+视图内容含义缩写</strong>。</p><p>2、<strong>如果视图只来源单个表，则为v+表名。如果视图由几个表关联产生就用v+下划线（_）连接几个表名，视图名尽量不超过30个字符。如超过30个字符则取简写</strong>。</p><p>3、<strong>如无特殊需要，严禁开发人员创建视图</strong>。</p><p>4、<strong>命名应使用小写</strong>。</p></blockquote><h3 id="存储过程命名规范" tabindex="-1">存储过程命名规范 <a class="header-anchor" href="#存储过程命名规范" aria-label="Permalink to &quot;存储过程命名规范&quot;">​</a></h3><blockquote><p>1、<strong>存储过程名以sp开头，表示存储过程（storage procedure）</strong>。<strong>之后多个单词以下划线（_）进行连接。存储过程命名中应体现其功能。存储过程名尽量不能超过30个字符</strong>。</p><p>2、<strong>存储过程中的输入参数以i_开头，输出参数以o开头</strong>。</p><p>3、<strong>命名应使用小写</strong>。</p></blockquote><div class="language-sql"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#F78C6C;">create</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">procedure</span><span style="color:#A6ACCD;"> sp_multi_param(</span><span style="color:#F78C6C;">in</span><span style="color:#A6ACCD;"> i_id </span><span style="color:#C792EA;">bigint</span><span style="color:#A6ACCD;">,</span></span>
<span class="line"><span style="color:#A6ACCD;">                                </span><span style="color:#F78C6C;">in</span><span style="color:#A6ACCD;"> i_name </span><span style="color:#C792EA;">varchar</span><span style="color:#A6ACCD;">(</span><span style="color:#F78C6C;">32</span><span style="color:#A6ACCD;">),</span></span>
<span class="line"><span style="color:#A6ACCD;">                                </span><span style="color:#F78C6C;">out</span><span style="color:#A6ACCD;"> o_memo </span><span style="color:#C792EA;">varchar</span><span style="color:#A6ACCD;">(</span><span style="color:#F78C6C;">100</span><span style="color:#A6ACCD;">))</span></span></code></pre></div><h3 id="函数命名规范" tabindex="-1">函数命名规范 <a class="header-anchor" href="#函数命名规范" aria-label="Permalink to &quot;函数命名规范&quot;">​</a></h3><blockquote><p>1、<strong>函数名以func开始，表示function。之后多个单词以下划线（_）进行连接，函数命名中应体现其功能。函数名尽量不超过30个字符</strong>。</p><p>2、<strong>命名应使用小写</strong>。</p></blockquote><div class="language-sql"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#F78C6C;">create</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">function</span><span style="color:#A6ACCD;"> </span><span style="color:#82AAFF;">func_format_date</span><span style="color:#A6ACCD;">(ctime </span><span style="color:#F78C6C;">datetime</span><span style="color:#A6ACCD;">)</span></span></code></pre></div><h3 id="触发器命名规范" tabindex="-1">触发器命名规范 <a class="header-anchor" href="#触发器命名规范" aria-label="Permalink to &quot;触发器命名规范&quot;">​</a></h3><blockquote><p>1、<strong>触发器以trig开头，表示trigger 触发器</strong>。</p><p>2、<strong>基本部分，描述触发器所加的表，触发器名尽量不超过30个字符</strong>。</p><p>3、<strong>后缀（_i,_u,_d）,表示触发条件的触发方式（insert,update或delete）</strong>。</p><p>4、<strong>命名应使用小写</strong>。</p></blockquote><div class="language-sql"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#F78C6C;">DROP</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">TRIGGER</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">IF</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">EXISTS</span><span style="color:#A6ACCD;"> trig_attach_log_d;</span></span>
<span class="line"><span style="color:#F78C6C;">CREATE</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">TRIGGER</span><span style="color:#A6ACCD;"> </span><span style="color:#82AAFF;">trig_attach_log_d</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">AFTER</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">DELETE</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">ON</span><span style="color:#A6ACCD;"> t_dept FOR EACH </span><span style="color:#F78C6C;">ROW</span><span style="color:#A6ACCD;">;</span></span></code></pre></div><h3 id="约束命名规范" tabindex="-1">约束命名规范 <a class="header-anchor" href="#约束命名规范" aria-label="Permalink to &quot;约束命名规范&quot;">​</a></h3><blockquote><p>1、<strong>唯一约束</strong>：<strong>uk_表名称_字段名</strong>。<strong>uk是UNIQUE KEY的缩写</strong>。比如给一个部门的部门名称加上唯一约束，来保证不重名，如下：ALTER TABLE t_dept ADD CONSTRAINT un_name UNIQUE(name);</p></blockquote><blockquote><p>2、<strong>外键约束</strong>：<strong>fk_表名，后面紧跟该外键所在的表名和对应的主表名（不含t_）</strong>。子表名和父表名用下划线(_)分隔。如下：ALTER TABLE t_user ADD CONSTRAINT fk_user_dept FOREIGN KEY(depno) REFERENCES t_dept (id);</p></blockquote><blockquote><p>3、<strong>非空约束：如无特殊需要，建议所有字段默认非空(not null)，不同数据类型必须给出默认值(default)</strong>。</p></blockquote><div class="language-sql"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#89DDFF;">`</span><span style="color:#C3E88D;">id</span><span style="color:#89DDFF;">`</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">int</span><span style="color:#A6ACCD;">(</span><span style="color:#F78C6C;">11</span><span style="color:#A6ACCD;">) </span><span style="color:#F78C6C;">NOT NULL</span><span style="color:#A6ACCD;">,</span></span>
<span class="line"><span style="color:#89DDFF;">`</span><span style="color:#C3E88D;">name</span><span style="color:#89DDFF;">`</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">varchar</span><span style="color:#A6ACCD;">(</span><span style="color:#F78C6C;">30</span><span style="color:#A6ACCD;">) </span><span style="color:#C792EA;">DEFAULT</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&#39;&#39;</span><span style="color:#A6ACCD;">,</span></span>
<span class="line"><span style="color:#89DDFF;">`</span><span style="color:#C3E88D;">deptId</span><span style="color:#89DDFF;">`</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">int</span><span style="color:#A6ACCD;">(</span><span style="color:#F78C6C;">11</span><span style="color:#A6ACCD;">) </span><span style="color:#C792EA;">DEFAULT</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">0</span><span style="color:#A6ACCD;">,</span></span>
<span class="line"><span style="color:#89DDFF;">`</span><span style="color:#C3E88D;">salary</span><span style="color:#89DDFF;">`</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">float</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">DEFAULT</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">NULL</span><span style="color:#A6ACCD;">,</span></span></code></pre></div><blockquote><p>4、<strong>出于性能考虑，如无特殊需要，建议不使用外键</strong>。<strong>参照完整性由代码控制。这个也是我们普遍的做法，从程序角度进行完整性控制，但是如果不注意，也会产生脏数据</strong>。</p></blockquote><blockquote><p>5、<strong>命名应使用小写</strong>。</p></blockquote><h3 id="用户命名规范" tabindex="-1">用户命名规范 <a class="header-anchor" href="#用户命名规范" aria-label="Permalink to &quot;用户命名规范&quot;">​</a></h3><blockquote><p>1、 <strong>生产使用的用户命名格式为 code_应用</strong></p><p>2、 <strong>只读用户命名规则为 read_应用</strong></p></blockquote><h2 id="数据库对象设计规范" tabindex="-1">数据库对象设计规范 <a class="header-anchor" href="#数据库对象设计规范" aria-label="Permalink to &quot;数据库对象设计规范&quot;">​</a></h2><h3 id="存储引擎的选择" tabindex="-1">存储引擎的选择 <a class="header-anchor" href="#存储引擎的选择" aria-label="Permalink to &quot;存储引擎的选择&quot;">​</a></h3><blockquote><p><strong>如无特殊需求，必须使用innodb存储引擎</strong></p></blockquote><blockquote><p><strong>可以通过 show variables like &#39;default_storage_engine&#39; 来查看当前默认引擎</strong>。主要有MyISAM 和 InnoDB，从5.5版本开始默认使用 InnoDB 引擎。</p></blockquote><blockquote><p>差别：<strong>MyISAM类型不支持事务处理等高级处理，而InnoDB类型支持。MyISAM类型的表强调的是性能，其执行速度比InnoDB类型更快，但是不提供事务支持，而InnoDB提供事务支持以及外部键等高级数据库功能</strong>。</p></blockquote><h3 id="字符集的选择" tabindex="-1">字符集的选择 <a class="header-anchor" href="#字符集的选择" aria-label="Permalink to &quot;字符集的选择&quot;">​</a></h3><blockquote><p><strong>如无特殊要求，必须使用utf8或utf8mb4</strong></p></blockquote><blockquote><p>在国内，选择对中文和各语言支持都非常完善的<code>utf8</code>格式是最好的方式，MySQL在5.5之后增加utf8mb4编码，<strong>mb4就是most bytes 4的意思，专门用来兼容四字节的unicode，可以插入表情包</strong>。</p></blockquote><blockquote><p><strong>所以utf8mb4是utf8的超集，除了将编码改为utf8mb4外不需要做其他转换。当然，为了节省空间，一般情况下使用utf8也就够了</strong>。</p></blockquote><p>可以使用如下脚本来查看数据库的编码格式</p><div class="language-sql"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#F78C6C;">1</span><span style="color:#A6ACCD;"> SHOW VARIABLES </span><span style="color:#F78C6C;">WHERE</span><span style="color:#A6ACCD;"> Variable_name </span><span style="color:#F78C6C;">LIKE</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&#39;</span><span style="color:#C3E88D;">character_set_%</span><span style="color:#89DDFF;">&#39;</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">OR</span><span style="color:#A6ACCD;"> Variable_name </span><span style="color:#F78C6C;">LIKE</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&#39;</span><span style="color:#C3E88D;">collation%</span><span style="color:#89DDFF;">&#39;</span><span style="color:#A6ACCD;">;</span></span>
<span class="line"><span style="color:#F78C6C;">2</span><span style="color:#A6ACCD;"> </span><span style="color:#676E95;font-style:italic;">-- 或</span></span>
<span class="line"><span style="color:#F78C6C;">3</span><span style="color:#A6ACCD;"> SHOW VARIABLES </span><span style="color:#F78C6C;">Like</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&#39;</span><span style="color:#C3E88D;">%char%</span><span style="color:#89DDFF;">&#39;</span><span style="color:#A6ACCD;">;</span></span></code></pre></div><h3 id="表设计规范" tabindex="-1">表设计规范 <a class="header-anchor" href="#表设计规范" aria-label="Permalink to &quot;表设计规范&quot;">​</a></h3><blockquote><p>1、<strong>不同应用间所对应的数据库表之间的关联应尽可能减少，不允许使用外键对表之间进行关联，确保组件对应的表之间的独立性，为系统或表结构的重构提供可能性</strong>。目前业内的做法一般 由程序控制参照完整性。</p></blockquote><blockquote><p>2、<strong>表设计的角度不应该针对整个系统进行数据库设计，而应该根据系统架构中组件划分，针对每个组件所处理的业务进行数据库设计</strong>。</p></blockquote><blockquote><p>3、<strong>表必须要有PK(primary key)，主键的优势是唯一标识、有效引用、高效检索，一般情况尽量有主键</strong>。</p><p>4、<strong>一个字段只表示一个含义</strong>。</p><p>5、<strong>表不应该有重复列</strong>。</p><p>6、<strong>禁止使用复杂数据类型(数组,自定义等)，Json类型的使用视情况而定</strong>。</p><p>7、<strong>需要join的字段(连接键)，数据类型必须保持绝对一致，避免隐式转换。比如关联的字段都是int类型</strong>。</p></blockquote><blockquote><p>8、<strong>设计应至少满足第三范式,尽量减少数据冗余</strong>。<strong>一些特殊场景允许反范式化设计，但在项目评审时需要对冗余字段的设计给出解释</strong>。</p></blockquote><blockquote><p>9、<strong>TEXT字段作为大体量文本存储，必须放在独立的表中 , 用PK与主表关联</strong>。<strong>如无特殊需要，禁止使用TEXT、BLOB字段</strong>。</p></blockquote><blockquote><p>10、<strong>需要定期删除(或者转移)过期数据的表，通过分表解决，我们的做法是按照2/8法则将操作频率较低的历史数据迁移到历史表中，按照时间或者则曾Id做切割点</strong>。</p></blockquote><blockquote><p>11、<strong>单表字段数不要太多，建议最多不要大于50个。过度的宽表对性能也是很大的影响</strong>。</p></blockquote><blockquote><p>12、<strong>MySQL在处理大表时，性能就开始明显降低，所以建议单表物理大小限制在16GB，表中数据行数控制在2000W内。业内的规则是超过2000W性能开始明显降低</strong>。</p><p><strong>但是这个值是灵活的，你可以根据实际情况进行测试来判断，比如阿里的标准就是500W，百度的确是2000W。实际上是否宽表，单行数据所占用的空间都有起到作用的</strong>。</p></blockquote><blockquote><p>13、<strong>如果数据量或数据增长在前期规划时就较大，那么在设计评审时就应加入分表策略</strong>，后续会有专门的文章来分析数据拆分的做法：<strong>垂直拆分（垂直分库和垂直分表）、水平拆分（分库分表和库内分表）</strong>；</p></blockquote><blockquote><p>14、<strong>无特殊需求，严禁使用分区表</strong></p></blockquote><h3 id="字段设计规范" tabindex="-1">字段设计规范 <a class="header-anchor" href="#字段设计规范" aria-label="Permalink to &quot;字段设计规范&quot;">​</a></h3><blockquote><p>1、INT：<strong>如无特殊需要，存放整型数字使用UNSIGNED INT型，整型字段后的数字代表显示长度</strong>。比如</p></blockquote><div class="language-sql"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#89DDFF;">`</span><span style="color:#C3E88D;">id</span><span style="color:#89DDFF;">`</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">int</span><span style="color:#A6ACCD;">(</span><span style="color:#F78C6C;">11</span><span style="color:#A6ACCD;">) </span><span style="color:#F78C6C;">NOT NULL</span></span></code></pre></div><blockquote><p>2、DATETIME：<strong>所有需要精确到时间(时分秒)的字段均使用DATETIME,不要使用TIMESTAMP类型</strong>。</p></blockquote><blockquote><p><strong>对于TIMESTAMP，它把写入的时间从当前时区转化为UTC（世界标准时间）进行存储。查询时，将其又转化为客户端当前时区进行返回</strong>。而<strong>对于DATETIME，不做任何改变，基本上是原样输入和输出</strong>。</p></blockquote><p>另外DATETIME存储的范围也比较大：</p><blockquote><p>timestamp所能存储的时间范围为：&#39;1970-01-01 00:00:01.000000&#39; 到 &#39;2038-01-19 03:14:07.999999&#39;。</p><p>datetime所能存储的时间范围为：&#39;1000-01-01 00:00:00.000000&#39; 到 &#39;9999-12-31 23:59:59.999999&#39;。</p></blockquote><blockquote><p>但是特殊情况，对于跨时区的业务，TIMESTAMP更为合适。</p></blockquote><blockquote><p>3、<strong>VARCHAR：所有动态长度字符串 全部使用VARCHAR类型,类似于状态等有限类别的字段,也使用可以比较明显表示出实际意义的字符串,而不应该使用INT之类的数字来代替</strong>；VARCHAR(N)，</p></blockquote><blockquote><p><strong>N表示的是字符数而不是字节数</strong>。比如VARCHAR(255)，可以最大可存储255个字符（字符包括英文字母，汉字，特殊字符等）。<strong>但N应尽可能小，因为MySQL一个表中所有的VARCHAR字段最大长度是65535个字节，且存储字符个数由所选字符集决定</strong>。</p></blockquote><blockquote><p><strong>如UTF8存储一个字符最大要3个字节，那么varchar在存放占用3个字节长度的字符时不应超过21845个字符。同时，在进行排序和创建临时表一类的内存操作时，会使用N的长度申请内存。(如无特殊需要，原则上单个varchar型字段不允许超过255个字符)</strong></p></blockquote><blockquote><p>4、<strong>TEXT：仅仅当字符数量可能超过20000个的时候,才可以使用TEXT类型来存放字符类数据,因为所有MySQL数据库都会使用UTF8字符集</strong>。</p></blockquote><blockquote><p><strong>所有使用TEXT类型的字段必须和原表进行分拆，与原表主键单独组成另外一个表进行存放，与大文本字段的隔离，目的是。如无特殊需要，不使用MEDIUMTEXT、TEXT、LONGTEXT类型</strong></p></blockquote><blockquote><p>5、<strong>对于精确浮点型数据存储，需要使用DECIMAL，严禁使用FLOAT和DOUBLE</strong>。</p><p>6、<strong>如无特殊需要，尽量不使用BLOB类型</strong></p><p>7、<strong>如无特殊需要，字段建议使用NOT NULL属性，可用默认值代替NULL</strong></p><p>8、<strong>自增字段类型必须是整型且必须为UNSIGNED，推荐类型为INT或BIGINT，自增字段必须是主键</strong>。</p></blockquote><blockquote><p>7、<strong>表达是与否概念的字段，必须使用 is_xxx 的方式命名，数据类型是 unsigned tinyint （1 表示是，0 表示否）</strong>。 说明：任何字段如果为非负数，必须是 unsigned。 注意：POJO 类中的任何布尔类型的变量，都不要加 is 前缀。数据库表示是与否的值，使用 tinyint 类型，坚持 is_xxx 的 命名方式是为了明确其取值含义与取值范围。</p><p>正例：<strong>表达逻辑删除的字段名 is_deleted，1 表示删除，0 表示未删除</strong>。</p></blockquote><blockquote><p>8、<strong>小数类型为 decimal，禁止使用 float 和 double</strong>。 说明：float 和 double 在存储的时候，存在精度损失的问题，很可能在值的比较时，得到不 正确的结果。如果存储的数据范围超过 decimal 的范围，建议将数据拆成整数和小数分开存储。（重要）</p></blockquote><blockquote><p>9、<strong>如果存储的字符串长度几乎相等，使用 char 定长字符串类型</strong>。</p></blockquote><blockquote><p>10、<strong>varchar 是可变长字符串，不预先分配存储空间，长度不要超过 5000，如果存储长度大于此值，定义字段类型为 text，独立出来一张表，用主键来对应，避免影响其它字段索 引效率</strong>。</p></blockquote><h3 id="索引设计规范" tabindex="-1">索引设计规范 <a class="header-anchor" href="#索引设计规范" aria-label="Permalink to &quot;索引设计规范&quot;">​</a></h3><blockquote><p>1、<strong>索引区分度</strong>：<strong>索引必须创建在索引选择性（区分度）较高的列上</strong>，选择性的计算方式为: selecttivity = count(distinct c_name)/count(*) ; 如果区分度结果小于0.2，则不在此列上创建索引，否则可能会拖慢SQL执行</p></blockquote><blockquote><p>2、<strong>遵循最左前缀</strong>：<strong>对于确定需要组成组合索引的多个字段，设计时建议将选择性高的字段靠前放</strong>。使用时，组合索引的首字段，必须在where条件中，且需要按照最左前缀规则去匹配。</p></blockquote><blockquote><p>3、<strong>禁止使用外键，可以在程序级别来约束完整性</strong></p><p>4、<strong>Text类型字段如果需要创建索引，必须使用前缀索引</strong></p><p>5、<strong>单张表的索引数量理论上应控制在5个以内。经常有大批量插入、更新操作表，应尽量少建索引，索引建立的原则理论上是多读少写的场景</strong>。</p><p>6、<strong>ORDER BY，GROUP BY，DISTINCT的字段需要添加在索引的后面，形成覆盖索引</strong></p></blockquote><blockquote><p>7、<strong>正确理解和计算索引字段的区分度，文中有计算规则，区分度高的索引，可以快速得定位数据，区分度太低，无法有效的利用索引，可能需要扫描大量数据页，和不使用索引没什么差别</strong>。</p></blockquote><blockquote><p>8、<strong>正确理解和计算前缀索引的字段长度，文中有判断规则，合适的长度要保证高的区分度和最恰当的索引存储容量，只有达到最佳状态，才是保证高效率的索引</strong>。</p></blockquote><blockquote><p>9、<strong>联合索引注意最左匹配原则：必须按照从左到右的顺序匹配</strong>，MySQL会一直向右匹配索引直到遇到范围查询(&gt;、&lt;、between、like)然后停止匹配。如：depno=1 and empname&gt;&#39;&#39; and job=1 如果建立(depno,empname,job)顺序的索引，job是用不到索引的。</p></blockquote><blockquote><p>10、<em><em>应需而取策略，查询记录的时候，不要一上来就使用</em>，只取需要的数据，可能的话尽量只利用索引覆盖，可以减少回表操作，提升效率</em>*。</p></blockquote><blockquote><p>11、<strong>正确判断是否使用联合索引（上面联合索引的使用那一小节有说明判断规则），也可以进一步分析到索引下推（IPC），减少回表操作，提升效率</strong>。</p></blockquote><blockquote><p>12、<strong>避免索引失效的原则：禁止对索引字段使用函数、运算符操作，会使索引失效。这是实际上就是需要保证索引所对应字段的”干净度“</strong>。</p></blockquote><blockquote><p>13、<strong>避免非必要的类型转换，字符串字段使用数值进行比较的时候会导致索引无效</strong>。</p></blockquote><blockquote><p>14、<strong>模糊查询&#39;%value%&#39;会使索引无效，变为全表扫描，因为无法判断扫描的区间，但是&#39;value%&#39;是可以有效利用索引</strong>。</p></blockquote><blockquote><p>15、<strong>索引覆盖排序字段，这样可以减少排序步骤，提升查询效率</strong></p></blockquote><blockquote><p>16、<strong>尽量的扩展索引，非必要不新建索引。比如表中已经有a的索引，现在要加(a,b)的索引，那么只需要修改原来的索引即可</strong>。</p></blockquote><p>举例子：比如一个品牌表，建立的的索引如下，一个主键索引，一个唯一索引</p><div class="language-sql"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#C792EA;">PRIMARY KEY</span><span style="color:#A6ACCD;"> (</span><span style="color:#89DDFF;">`</span><span style="color:#C3E88D;">id</span><span style="color:#89DDFF;">`</span><span style="color:#A6ACCD;">),</span></span>
<span class="line"><span style="color:#F78C6C;">UNIQUE</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">KEY</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">`</span><span style="color:#C3E88D;">uni_brand_define</span><span style="color:#89DDFF;">`</span><span style="color:#A6ACCD;"> (</span><span style="color:#89DDFF;">`</span><span style="color:#C3E88D;">app_id</span><span style="color:#89DDFF;">`</span><span style="color:#A6ACCD;">,</span><span style="color:#89DDFF;">`</span><span style="color:#C3E88D;">define_id</span><span style="color:#89DDFF;">`</span><span style="color:#A6ACCD;">)</span></span></code></pre></div><p>当你同事业务代码中的检索语句如下的时候，应该立即警告了，即没有覆盖索引，也没按照最左前缀原则：</p><div class="language-sql"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#F78C6C;">select</span><span style="color:#A6ACCD;"> brand_id,brand_name </span><span style="color:#F78C6C;">from</span><span style="color:#A6ACCD;">  ds_brand_system </span><span style="color:#F78C6C;">where</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">status</span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;">?  </span><span style="color:#F78C6C;">and</span><span style="color:#A6ACCD;"> define_id</span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;">?  </span><span style="color:#F78C6C;">and</span><span style="color:#A6ACCD;"> app_id</span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;">?</span></span></code></pre></div><p>建议改成如下：</p><div class="language-sql"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#F78C6C;">select</span><span style="color:#A6ACCD;"> brand_id,brand_name </span><span style="color:#F78C6C;">from</span><span style="color:#A6ACCD;">  ds_brand_system </span><span style="color:#F78C6C;">where</span><span style="color:#A6ACCD;"> app_id</span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;">? </span><span style="color:#F78C6C;">and</span><span style="color:#A6ACCD;"> define_id</span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;">?  </span><span style="color:#F78C6C;">and</span><span style="color:#A6ACCD;">  </span><span style="color:#F78C6C;">status</span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;">?</span></span></code></pre></div><h3 id="约束设计规范" tabindex="-1">约束设计规范 <a class="header-anchor" href="#约束设计规范" aria-label="Permalink to &quot;约束设计规范&quot;">​</a></h3><blockquote><p>1、<strong>PK应该是有序并且无意义的，由开发人员自定义，尽可能简短，并且是自增序列</strong>。</p><p>2、<strong>表中除PK以外,还存在唯一性约束的,可以在数据库中创建以“uk_”作为前缀的唯一约束索引</strong>。</p><p>3、<strong>PK字段不允许更新</strong>。</p><p>4、<strong>禁止创建外键约束，外键约束由程序控制</strong>。</p><p>5、<strong>如无特殊需要，所有字段必须添加非空约束，即not null</strong>。</p><p>6、<strong>如无特殊需要，所有字段必须有默认值</strong></p></blockquote><blockquote><p>5、<strong>表必备三字段：id, gmt_create, gmt_modified</strong>，其中 id 必为主键，类型为 bigint unsigned、单表时自增、步长为 1。（如果使用分库分表集群部署，则id类型为verchar，非自增，业务中使用分布式id生成器）。<strong>gmt_create, gmt_modified 的类型均为 datetime 类型，前者现在时表示主动创建，后者过去分词表示被 动更新</strong>。</p></blockquote><blockquote><p>6、<strong>单表行数超过 500 万行或者单表容量超过 2GB，才推荐进行分库分表</strong>。 <strong>说明：如果预计三年后的数据量根本达不到这个级别，请不要在创建表时就分库分表</strong>。</p></blockquote><blockquote><p>11、<strong>唯一索引名为 uk_字段名；普通索引名则为 idx_字段名。说明：uk_ 即 unique key；idx_ 即 index简称</strong></p></blockquote><blockquote><p>12、<strong>不得使用外键与级联，一切外键概念必须在应用层解决。外键与级联更新适用于单机低并发，不适合分布式、高并发集群；级联更新是强阻塞，存在数据库更新风暴的风险；外键影响数据库的插入速度</strong>。</p></blockquote><h2 id="sql使用规范" tabindex="-1">SQL使用规范 <a class="header-anchor" href="#sql使用规范" aria-label="Permalink to &quot;SQL使用规范&quot;">​</a></h2><h3 id="检索的规范性" tabindex="-1">检索的规范性 <a class="header-anchor" href="#检索的规范性" aria-label="Permalink to &quot;检索的规范性&quot;">​</a></h3><blockquote><p>尽量避免使用<code>select *</code>，join语句使用<code>select *</code>可能导致只需要访问索引即可完成的查询需要回表取数。<strong>一种是可能取出很多不需要的数据，对于宽表来说，这是灾难</strong>；一种是<strong>尽可能避免回表，因为取一些根本不需要的数据而回表导致性能低下</strong>，是很不合算。</p></blockquote><blockquote><p>严禁使用 select * from t_name ，而不加任何where条件，道理一样，这样<strong>会变成全表全字段扫描</strong>。</p></blockquote><blockquote><p>MySQL中的text类型字段存储：<strong>不与其他普通字段存放在一起,因为读取效率低，也会影响其他轻量字段存取效率</strong>。*<em>如果不需要text类型字段，又使用了select <em>，会让该执行消耗大量io，效率也很低下</em></em></p></blockquote><blockquote><p>4、在取出字段上可以使用相关函数，但<strong>应尽可能避免出现 now() , rand() , sysdate() 等不确定结果的函数</strong>，在Where条件中的过滤条件字段上严禁使用任何函数，包括数据类型转换函数。<strong>大量的计算和转换会造成效率低下</strong>，这个在索引那边也描述过了。</p></blockquote><blockquote><p>5、<strong>分页查询语句全部都需要带有排序条件 , 否则很容易引起乱序</strong></p><p>6、<strong>用in()/union替换or，效率会好一些，并注意in的个数小于300</strong></p><p>7、<strong>严禁使用%前缀进行模糊前缀查询</strong>:如：select a,b,c from t_name where a like ‘%name’; <strong>可以使用%模糊后缀查询</strong>如：select a,b from t_name where a like ‘name%’;</p></blockquote><blockquote><p><strong>避免使用子查询，可以把子查询优化为join操作，通常子查询在in子句中，且子查询中为简单SQL(不包含union、group by、order by、limit从句)时，才可以把子查询转化为关联查询进行优化</strong>。</p></blockquote><h3 id="子查询性能差" tabindex="-1">子查询性能差 <a class="header-anchor" href="#子查询性能差" aria-label="Permalink to &quot;子查询性能差&quot;">​</a></h3><blockquote><p><strong>子查询的结果集无法使用索引，通常子查询的结果集会被存储到临时表中，不论是内存临时表还是磁盘临时表都不会存在索引，所以查询性能 会受到一定的影响</strong>；</p></blockquote><blockquote><p><strong>特别是对于返回结果集比较大的子查询，其对查询性能的影响也就越大</strong>；</p></blockquote><blockquote><p><strong>由于子查询会产生大量的临时表也没有索引，所以会消耗过多的CPU和IO资源，产生大量的慢查询</strong>。</p></blockquote><h3 id="操作的规范性" tabindex="-1">操作的规范性 <a class="header-anchor" href="#操作的规范性" aria-label="Permalink to &quot;操作的规范性&quot;">​</a></h3><blockquote><p><strong>禁止使用不含字段列表的INSERT语句</strong></p></blockquote><div class="language-sql"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#F78C6C;">insert into</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">values</span><span style="color:#A6ACCD;"> (</span><span style="color:#89DDFF;">&#39;</span><span style="color:#C3E88D;">a</span><span style="color:#89DDFF;">&#39;</span><span style="color:#A6ACCD;">,</span><span style="color:#89DDFF;">&#39;</span><span style="color:#C3E88D;">b</span><span style="color:#89DDFF;">&#39;</span><span style="color:#A6ACCD;">,</span><span style="color:#89DDFF;">&#39;</span><span style="color:#C3E88D;">c</span><span style="color:#89DDFF;">&#39;</span><span style="color:#A6ACCD;">);  </span></span>
<span class="line"><span style="color:#A6ACCD;">应该使用  </span></span>
<span class="line"><span style="color:#F78C6C;">insert into</span><span style="color:#A6ACCD;"> t_name(c1,c2,c3) </span><span style="color:#F78C6C;">values</span><span style="color:#A6ACCD;"> (</span><span style="color:#89DDFF;">&#39;</span><span style="color:#C3E88D;">a</span><span style="color:#89DDFF;">&#39;</span><span style="color:#A6ACCD;">,</span><span style="color:#89DDFF;">&#39;</span><span style="color:#C3E88D;">b</span><span style="color:#89DDFF;">&#39;</span><span style="color:#A6ACCD;">,</span><span style="color:#89DDFF;">&#39;</span><span style="color:#C3E88D;">c</span><span style="color:#89DDFF;">&#39;</span><span style="color:#A6ACCD;">);</span></span></code></pre></div><blockquote><p><strong>大批量写操作（UPDATE、DELETE、INSERT），需要分批多次进行操作</strong></p></blockquote><blockquote><p><strong>大批量操作可能会造成严重的主从延迟</strong>，<strong>特别是主从模式下，大批量操作可能会造成严重的主从延迟，因为需要slave从master的binlog中读取日志来进行数据同步</strong>。</p></blockquote><blockquote><p><strong>binlog日志为row格式时会产生大量的日志</strong></p></blockquote><h1 id="数据库建模工具" tabindex="-1">数据库建模工具 <a class="header-anchor" href="#数据库建模工具" aria-label="Permalink to &quot;数据库建模工具&quot;">​</a></h1><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202304101420099.png" alt="image-20230410142019980" style="zoom:80%;"><h2 id="mysql-workbench" tabindex="-1">MySQL Workbench <a class="header-anchor" href="#mysql-workbench" aria-label="Permalink to &quot;MySQL Workbench&quot;">​</a></h2><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202304101423456.png" alt="image-20230410142357999" style="zoom:80%;"><h2 id="sql-power-architect" tabindex="-1">SQL Power Architect <a class="header-anchor" href="#sql-power-architect" aria-label="Permalink to &quot;SQL Power Architect&quot;">​</a></h2><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202304101424798.png" alt="image-20230410142427608" style="zoom:80%;"><h2 id="pdmaner⭐" tabindex="-1">PDManer⭐ <a class="header-anchor" href="#pdmaner⭐" aria-label="Permalink to &quot;PDManer⭐&quot;">​</a></h2><blockquote><p>国产，对中文支持好</p></blockquote><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202304101425110.png" alt="image-20230410142525971" style="zoom:80%;"><h2 id="db-designer" tabindex="-1">DB Designer <a class="header-anchor" href="#db-designer" aria-label="Permalink to &quot;DB Designer&quot;">​</a></h2><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202304101426330.png" alt="image-20230410142614130" style="zoom:80%;"><h2 id="dbdiagram-io" tabindex="-1">dbdiagram.io <a class="header-anchor" href="#dbdiagram-io" aria-label="Permalink to &quot;dbdiagram.io&quot;">​</a></h2><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202304101426292.png" alt="image-20230410142644163" style="zoom:80%;"><h1 id="表设计的经验准则" tabindex="-1">表设计的经验准则 <a class="header-anchor" href="#表设计的经验准则" aria-label="Permalink to &quot;表设计的经验准则&quot;">​</a></h1><h2 id="命名规范" tabindex="-1">命名规范 <a class="header-anchor" href="#命名规范" aria-label="Permalink to &quot;命名规范&quot;">​</a></h2><blockquote><p>数据库表名、字段名、索引名等都需要命名规范，可读性高（一般要求用英文），让别人一看命名，就知道这个字段表示什么意思。</p></blockquote><p>比如一个表的账号字段，<strong>反例如下</strong>：</p><div class="language-sql"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">acc_no,1_acc_no,zhanghao</span></span></code></pre></div><p><strong>正例：</strong></p><div class="language-sql"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">account_no,account_number</span></span></code></pre></div><ul><li>表名、字段名必须使用小写字母或者数字，禁止使用数字开头，禁止使用拼音，并且一般不使用英文缩写。</li><li>主键索引名为<code>pk_字段名</code>；唯一索引名为<code>uk_字段名</code>；普通索引名则为<code>idx_字段名</code>。</li></ul><h2 id="选择合适的字段类型" tabindex="-1">选择合适的字段类型 <a class="header-anchor" href="#选择合适的字段类型" aria-label="Permalink to &quot;选择合适的字段类型&quot;">​</a></h2><p>设计表时，我们需要选择合适的字段类型，比如：</p><ul><li>选择存储空间小的字段类型，就好像数字类型的<code>tinyint、smallint、int、bigint</code>，从左往右开始选择</li><li>小数类型如金额，则选择 <code>decimal</code>，禁止使用 <code>float</code> 和 <code>double</code>。</li><li>如果存储的字符串长度几乎相等，使用 <code>char</code> 定长字符串类型。</li><li><code>varchar</code>是可变长字符串，不预先分配存储空间，长度不要超过<code>5000</code>。</li><li>如果存储的值太大，建议字段类型修改为<code>text</code>，同时抽出单独一张表，用主键与之对应。</li><li>同一表中，所有<code>varchar</code>字段的长度加起来，不能大于<code>65535</code>。如果有这样的需求，使用<code>TEXT/LONGTEXT </code>类型</li></ul><h2 id="主键设计要合理" tabindex="-1">主键设计要合理 <a class="header-anchor" href="#主键设计要合理" aria-label="Permalink to &quot;主键设计要合理&quot;">​</a></h2><blockquote><p>主键设计的话，最好不要与业务逻辑有所关联。有些业务上的字段，比如身份证，虽然是唯一的，一些开发者喜欢用它来做主键，但是不是很建议哈。<strong>主键最好是毫无意义的一串独立不重复的数字</strong>，比如<code>UUID</code>，又或者<code>Auto_increment</code>自增的主键，或者是雪花算法生成的主键等等。</p></blockquote><p><img src="https://mmbiz.qpic.cn/mmbiz_jpg/PoF8jo1PmpxLwpugXhicDPDvgRXjFPRn4jFgk9O0befPpt96IGVIeGG30rR51ibsLWp0RGv8WUNkmBCDteUTXYEA/640?wx_fmt=jpeg&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><h2 id="选择合适的字段长度" tabindex="-1">选择合适的字段长度 <a class="header-anchor" href="#选择合适的字段长度" aria-label="Permalink to &quot;选择合适的字段长度&quot;">​</a></h2><p>先问大家一个问题，大家知道数据库字段长度表示<strong>字符长度</strong>还是<strong>字节长度</strong>嘛？</p><blockquote><p>其实在 mysql 中，<code>varchar</code>和<code>char</code>类型表示字符长度，而其他类型的则都表示字节长度。比如<code>char(10)</code>表示字符长度是 10，而<code>bigint（4）</code>表示显示长度是<code>4</code>个字节，但是因为 bigint 实际长度是<code>8</code>个字节，所以bigint（4）的实际长度就是 8 个字节。</p></blockquote><p>我们在设计表的时候，需要充分考虑一个字段的长度，比如一个用户名字段（它的长度 5~20 个字符），你觉得应该设置多长呢？可以考虑设置为 <code>username varchar（32）</code>。字段长度一般设置为 2 的幂（也就是<code>2 的 n</code>次方）。</p><h2 id="优先考虑逻辑删除-而不是物理删除" tabindex="-1">优先考虑逻辑删除，而不是物理删除 <a class="header-anchor" href="#优先考虑逻辑删除-而不是物理删除" aria-label="Permalink to &quot;优先考虑逻辑删除，而不是物理删除&quot;">​</a></h2><p>什么是物理删除？什么是逻辑删除？</p><ul><li>物理删除：把数据从硬盘中删除，可释放存储空间。</li><li>逻辑删除：给数据添加一个字段，比如<code>is_deleted</code>，以标记该数据已经逻辑删除。</li></ul><p>物理删除就是执行<code>delete</code>语句，如删除<code>account_no =‘666’</code>的账户信息 SQL 如下：</p><div class="language-sql"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#F78C6C;">delete</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">from</span><span style="color:#A6ACCD;"> account_info_tab whereaccount_no </span><span style="color:#89DDFF;">=</span><span style="color:#89DDFF;">&#39;</span><span style="color:#C3E88D;">666</span><span style="color:#89DDFF;">&#39;</span><span style="color:#A6ACCD;">;</span></span></code></pre></div><p>逻辑删除呢，就是这样：</p><div class="language-sql"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#F78C6C;">update</span><span style="color:#A6ACCD;"> account_info_tab </span><span style="color:#F78C6C;">set</span><span style="color:#A6ACCD;"> is_deleted </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">1</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">where</span><span style="color:#A6ACCD;"> account_no </span><span style="color:#89DDFF;">=</span><span style="color:#89DDFF;">&#39;</span><span style="color:#C3E88D;">666</span><span style="color:#89DDFF;">&#39;</span><span style="color:#A6ACCD;">;</span></span></code></pre></div><p><strong>为什么推荐用逻辑删除，不推荐物理删除呢？</strong></p><blockquote><ul><li>为什么不推荐使用物理删除，因为恢复数据很困难。</li><li>物理删除会使自增主键不再连续。</li><li>核心业务表的数据不建议做物理删除，只适合做状态变更。</li></ul></blockquote><h2 id="每个表都需要添加几个通用字段" tabindex="-1">每个表都需要添加几个通用字段 <a class="header-anchor" href="#每个表都需要添加几个通用字段" aria-label="Permalink to &quot;每个表都需要添加几个通用字段&quot;">​</a></h2><p>一般来说，每个表都会具备以下这几个字段：</p><ul><li>id：主键，一个表必须得有主键，必须。</li><li>create_time：创建时间，必须。</li><li>modifed_time/update_time：修改时间，必须，更新记录时，需要更新它。</li><li>version：数据记录的版本号，用于乐观锁，非必须。</li><li>remark ：数据记录备注，非必须。</li><li>modified_by：修改人，非必须。</li><li>creator ：创建人，非必须。</li></ul><p><img src="https://mmbiz.qpic.cn/mmbiz_jpg/PoF8jo1PmpxLwpugXhicDPDvgRXjFPRn4ygqEGKDbHhdAIxmtedSCTZPdicJOLibpFgcicCqC72aTblxSWiaKL1gNow/640?wx_fmt=jpeg&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><h2 id="一张表的字段不宜过多" tabindex="-1">一张表的字段不宜过多 <a class="header-anchor" href="#一张表的字段不宜过多" aria-label="Permalink to &quot;一张表的字段不宜过多&quot;">​</a></h2><p>我们建表的时候，要牢记，一张表的字段不宜过多，一般尽量不要超过 20 个字段。</p><p>如果一张表的字段过多，表中保存的数据可能就会很大，查询效率就会很低。</p><p>因此，一张表不要设计太多字段，如果业务需求，实在需要很多字段，可以把一张大的表，拆成多张小的表，它们的主键相同即可。</p><p>当表的字段数非常多时，可以将表分成两张表，一张作为条件查询表，一张作为详细内容表（主要是为了性能考虑）。</p><h2 id="尽可能使用-not-null-定义字段" tabindex="-1">尽可能使用 not null 定义字段 <a class="header-anchor" href="#尽可能使用-not-null-定义字段" aria-label="Permalink to &quot;尽可能使用 not null 定义字段&quot;">​</a></h2><p>如果没有特殊的理由， 一般都建议将字段定义为<code>NOT NULL</code> 。</p><p><strong>为什么呢？</strong></p><ul><li>首先，<code>NOT NULL</code> 可以防止出现空指针问题。</li><li>其次，<code>NULL</code>值存储也需要额外的空间，它也会导致比较运算更为复杂，使优化器难以优化 SQL。</li><li><code>NULL</code>值有可能会导致索引失效。</li><li>如果将字段默认设置成一个空字符串或常量值并没有什么不同，且都不会影响到应用逻辑， 那就可以将这个字段设置为<code>NOT NULL</code>。</li></ul><h2 id="设计表时-评估哪些字段需要加索引" tabindex="-1">设计表时，评估哪些字段需要加索引 <a class="header-anchor" href="#设计表时-评估哪些字段需要加索引" aria-label="Permalink to &quot;设计表时，评估哪些字段需要加索引&quot;">​</a></h2><p>首先，评估你的表数据量。如果你的表数据量只有一百几十行，就没有必要加索引。否则设计表的时候，如果有查询条件的字段，一般就需要建立索引。但是索引也不能滥用：</p><ul><li>索引也不要建得太多，一般单表索引个数不要超过<code>5</code>个。因为创建过多的索引，会降低写的速度。</li><li>区分度不高的字段，不能加索引，如性别等。</li><li>索引创建完后，还是要注意避免索引失效的情况，如使用 mysql 的内置函数，会导致索引失效。</li><li>索引过多的话，可以通过联合索引的方式来优化。然后，索引还有一些规则，如覆盖索引，最左匹配原则等等。</li></ul><p>假设你新建一张用户表，如下：</p><div class="language-sql"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#F78C6C;">CREATE</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">TABLE</span><span style="color:#A6ACCD;"> </span><span style="color:#82AAFF;">user_info_tab</span><span style="color:#A6ACCD;"> (</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#89DDFF;">`</span><span style="color:#C3E88D;">id</span><span style="color:#89DDFF;">`</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">int</span><span style="color:#A6ACCD;">(</span><span style="color:#F78C6C;">11</span><span style="color:#A6ACCD;">) </span><span style="color:#F78C6C;">NOT NULL</span><span style="color:#A6ACCD;"> AUTO_INCREMENT,</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#89DDFF;">`</span><span style="color:#C3E88D;">user_id</span><span style="color:#89DDFF;">`</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">int</span><span style="color:#A6ACCD;">(</span><span style="color:#F78C6C;">11</span><span style="color:#A6ACCD;">) </span><span style="color:#F78C6C;">NOT NULL</span><span style="color:#A6ACCD;">,</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#89DDFF;">`</span><span style="color:#C3E88D;">age</span><span style="color:#89DDFF;">`</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">int</span><span style="color:#A6ACCD;">(</span><span style="color:#F78C6C;">11</span><span style="color:#A6ACCD;">) </span><span style="color:#C792EA;">DEFAULT</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">NULL</span><span style="color:#A6ACCD;">,</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#89DDFF;">`</span><span style="color:#C3E88D;">name</span><span style="color:#89DDFF;">`</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">varchar</span><span style="color:#A6ACCD;">(</span><span style="color:#F78C6C;">255</span><span style="color:#A6ACCD;">) </span><span style="color:#F78C6C;">NOT NULL</span><span style="color:#A6ACCD;">,</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#89DDFF;">`</span><span style="color:#C3E88D;">create_time</span><span style="color:#89DDFF;">`</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">datetime</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">NOT NULL</span><span style="color:#A6ACCD;">,</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#89DDFF;">`</span><span style="color:#C3E88D;">modifed_time</span><span style="color:#89DDFF;">`</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">datetime</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">NOT NULL</span><span style="color:#A6ACCD;">,</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#C792EA;">PRIMARY KEY</span><span style="color:#A6ACCD;"> (</span><span style="color:#89DDFF;">`</span><span style="color:#C3E88D;">id</span><span style="color:#89DDFF;">`</span><span style="color:#A6ACCD;">)</span></span>
<span class="line"><span style="color:#A6ACCD;">) ENGINE</span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;">InnoDB </span><span style="color:#C792EA;">DEFAULT</span><span style="color:#A6ACCD;"> CHARSET</span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;">utf8;</span></span></code></pre></div><p>对于这张表，很可能会有根据<code>user_id</code>或者<code>name</code>查询用户信息，并且，<code>user_id</code>是唯一的。因此，你可以给<code>user_id</code>加上唯一索引，<code>name</code>加上普通索引：</p><div class="language-sql"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#F78C6C;">CREATE</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">TABLE</span><span style="color:#A6ACCD;"> </span><span style="color:#82AAFF;">user_info_tab</span><span style="color:#A6ACCD;"> (</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#89DDFF;">`</span><span style="color:#C3E88D;">id</span><span style="color:#89DDFF;">`</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">int</span><span style="color:#A6ACCD;">(</span><span style="color:#F78C6C;">11</span><span style="color:#A6ACCD;">) </span><span style="color:#F78C6C;">NOT NULL</span><span style="color:#A6ACCD;"> AUTO_INCREMENT,</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#89DDFF;">`</span><span style="color:#C3E88D;">user_id</span><span style="color:#89DDFF;">`</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">int</span><span style="color:#A6ACCD;">(</span><span style="color:#F78C6C;">11</span><span style="color:#A6ACCD;">) </span><span style="color:#F78C6C;">NOT NULL</span><span style="color:#A6ACCD;">,</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#89DDFF;">`</span><span style="color:#C3E88D;">age</span><span style="color:#89DDFF;">`</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">int</span><span style="color:#A6ACCD;">(</span><span style="color:#F78C6C;">11</span><span style="color:#A6ACCD;">) </span><span style="color:#C792EA;">DEFAULT</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">NULL</span><span style="color:#A6ACCD;">,</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#89DDFF;">`</span><span style="color:#C3E88D;">name</span><span style="color:#89DDFF;">`</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">varchar</span><span style="color:#A6ACCD;">(</span><span style="color:#F78C6C;">255</span><span style="color:#A6ACCD;">) </span><span style="color:#F78C6C;">NOT NULL</span><span style="color:#A6ACCD;">,</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#89DDFF;">`</span><span style="color:#C3E88D;">create_time</span><span style="color:#89DDFF;">`</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">datetime</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">NOT NULL</span><span style="color:#A6ACCD;">,</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#89DDFF;">`</span><span style="color:#C3E88D;">modifed_time</span><span style="color:#89DDFF;">`</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">datetime</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">NOT NULL</span><span style="color:#A6ACCD;">,</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#C792EA;">PRIMARY KEY</span><span style="color:#A6ACCD;"> (</span><span style="color:#89DDFF;">`</span><span style="color:#C3E88D;">id</span><span style="color:#89DDFF;">`</span><span style="color:#A6ACCD;">),</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#F78C6C;">KEY</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">`</span><span style="color:#C3E88D;">idx_name</span><span style="color:#89DDFF;">`</span><span style="color:#A6ACCD;"> (</span><span style="color:#89DDFF;">`</span><span style="color:#C3E88D;">name</span><span style="color:#89DDFF;">`</span><span style="color:#A6ACCD;">) </span><span style="color:#F78C6C;">USING</span><span style="color:#A6ACCD;"> BTREE,</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#F78C6C;">UNIQUE</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">KEY</span><span style="color:#A6ACCD;"> un_user_id (user_id)</span></span>
<span class="line"><span style="color:#A6ACCD;">) ENGINE</span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;">InnoDB </span><span style="color:#C792EA;">DEFAULT</span><span style="color:#A6ACCD;"> CHARSET</span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;">utf8;</span></span></code></pre></div><h2 id="不需要严格遵守-3nf" tabindex="-1">不需要严格遵守 3NF <a class="header-anchor" href="#不需要严格遵守-3nf" aria-label="Permalink to &quot;不需要严格遵守 3NF&quot;">​</a></h2><p>通过业务字段冗余来减少表关联</p><p>什么是数据库三范式（<code>3NF</code>），大家是否还有印象吗？</p><ul><li>第一范式：对属性的原子性，要求属性具有原子性，不可再分解。</li><li>第二范式：对记录的唯一性，要求记录有唯一标识，即实体的唯一性，即不存在部分依赖。</li><li>第三方式：对字段的冗余性，要求任何字段不能由其他字段派生出来，它要求字段没有冗余，即不存在传递依赖。</li></ul><p>我们设计表及其字段之间的关系，应尽量满足第三范式。但是有时候，可以适当冗余，来提高效率。比如以下这张表：</p><table><thead><tr><th style="text-align:left;">商品名称</th><th style="text-align:left;">商品型号</th><th style="text-align:left;">单价</th><th style="text-align:left;">数量</th><th style="text-align:left;">总金额</th></tr></thead><tbody><tr><td style="text-align:left;">手机</td><td style="text-align:left;">华为</td><td style="text-align:left;">8000</td><td style="text-align:left;">5</td><td style="text-align:left;">40000</td></tr></tbody></table><p>以上这张存放商品信息的基本表。<code>总金额</code>这个字段的存在，表明该表的设计不满足第三范式，因为<code>总金额</code>可以由<code>单价*数量</code>得到，说明<code>总金额</code>是冗余字段。但是，增加<code>总金额</code>这个冗余字段，可以提高查询统计的速度，这就是以空间换时间的作法。</p><p>当然，这只是个小例子，大家开发设计的时候，要结合具体业务进行分析。</p><h2 id="避免使用-mysql-保留字" tabindex="-1">避免使用 MySQL 保留字 <a class="header-anchor" href="#避免使用-mysql-保留字" aria-label="Permalink to &quot;避免使用 MySQL 保留字&quot;">​</a></h2><p>如果库名、表名、字段名等属性含有保留字时，<code>SQL</code>语句必须用反引号来引用属性名称，这将使得 SQL 语句书写、SHELL 脚本中变量的转义等变得非常复杂。</p><p>因此，我们一般避免使用<code>MySQL</code>保留字，如<code>select、interval、desc</code>等等。</p><h2 id="不搞外键关联-一般都在代码维护" tabindex="-1">不搞外键关联，一般都在代码维护 <a class="header-anchor" href="#不搞外键关联-一般都在代码维护" aria-label="Permalink to &quot;不搞外键关联，一般都在代码维护&quot;">​</a></h2><p>什么是外键呢？</p><blockquote><p>外键，也叫<code>FOREIGN KEY</code>，它是用于将两个表连接在一起的键。<code>FOREIGN KEY</code>是一个表中的一个字段（或字段集合），它引用另一个表中的<code>PRIMARY KEY</code>。它是用来保证数据的一致性和完整性的。</p></blockquote><p>阿里的<code>Java</code>规范也有这么一条：</p><blockquote><p>【强制】<strong>不得使用外键与级联</strong>，一切外键概念必须在应用层解决。</p></blockquote><p>我们为什么不推荐使用<strong>外键</strong>呢？</p><blockquote><ul><li>使用外键存在性能问题、并发死锁问题、使用起来不方便问题等等。每次做<code>DELETE</code>或者<code>UPDATE</code>都必须考虑外键约束，会导致开发的时候很难受，测试数据也不方便。</li><li>还有一个场景不能使用外键，就是分库分表。</li></ul></blockquote><h2 id="一般都选择-innodb-存储引擎" tabindex="-1">一般都选择 INNODB 存储引擎 <a class="header-anchor" href="#一般都选择-innodb-存储引擎" aria-label="Permalink to &quot;一般都选择 INNODB 存储引擎&quot;">​</a></h2><p>建表是需要选择<strong>存储引擎</strong>的，我们一般都选择<code>INNODB</code>存储引擎，除非读写比率小于<code>1%</code>，才考虑使用<code>MyISAM</code>。</p><p>有些小伙伴可能会有疑惑，不是还有<code>MEMORY</code>等其他存储引擎吗？什么时候使用呢？其实其他存储引擎一般都建议在<code>DBA</code>的指导下使用。</p><p>我们来复习一下<code>MySQL</code>这三种存储引擎的对比区别吧：</p><table><thead><tr><th style="text-align:left;">特性</th><th style="text-align:left;">INNODB</th><th style="text-align:left;">MyISAM</th><th style="text-align:left;">MEMORY</th></tr></thead><tbody><tr><td style="text-align:left;">事务安全</td><td style="text-align:left;">支持</td><td style="text-align:left;">无</td><td style="text-align:left;">无</td></tr><tr><td style="text-align:left;">存储限制</td><td style="text-align:left;">64TB</td><td style="text-align:left;">有</td><td style="text-align:left;">有</td></tr><tr><td style="text-align:left;">空间使用</td><td style="text-align:left;">高</td><td style="text-align:left;">低</td><td style="text-align:left;">低</td></tr><tr><td style="text-align:left;">内存使用</td><td style="text-align:left;">高</td><td style="text-align:left;">低</td><td style="text-align:left;">高</td></tr><tr><td style="text-align:left;">插入数据速度</td><td style="text-align:left;">低</td><td style="text-align:left;">高</td><td style="text-align:left;">高</td></tr><tr><td style="text-align:left;">是否支持外键</td><td style="text-align:left;">支持</td><td style="text-align:left;">无</td><td style="text-align:left;">无</td></tr></tbody></table><h2 id="选择合适统一的字符集" tabindex="-1">选择合适统一的字符集 <a class="header-anchor" href="#选择合适统一的字符集" aria-label="Permalink to &quot;选择合适统一的字符集&quot;">​</a></h2><p>数据库库、表、开发程序等都需要统一字符集，通常中英文环境用<code>utf8</code>。</p><p>MySQL 支持的字符集有<code>utf8、utf8mb4、GBK、latin1</code>等。</p><ul><li>utf8：支持中英文混合场景，国际通用，3 个字节长度。</li><li>utf8mb4: 完全兼容 utf8，4 个字节长度，一般存储 <strong>emoji 表情</strong>需要用到它。</li><li>GBK ：支持中文，但是不支持国际通用字符集，2 个字节长度。</li><li>latin1：MySQL 默认字符集，1 个字节长度。</li></ul><h2 id="枚举类型注释清楚" tabindex="-1">枚举类型注释清楚 <a class="header-anchor" href="#枚举类型注释清楚" aria-label="Permalink to &quot;枚举类型注释清楚&quot;">​</a></h2><p>如果你设计的数据库字段是枚举类型的话，就需要在<code>comment</code>后面注释清楚每个枚举的意思，以便于维护。</p><p>正例如下：</p><div class="language-sql"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#89DDFF;">`</span><span style="color:#C3E88D;">session_status</span><span style="color:#89DDFF;">`</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">varchar</span><span style="color:#A6ACCD;">(</span><span style="color:#F78C6C;">2</span><span style="color:#A6ACCD;">) </span><span style="color:#C792EA;">COLLATE</span><span style="color:#A6ACCD;"> utf8_bin </span><span style="color:#F78C6C;">NOT NULL</span><span style="color:#A6ACCD;"> </span></span>
<span class="line"><span style="color:#A6ACCD;">COMMENT </span><span style="color:#89DDFF;">&#39;</span><span style="color:#C3E88D;">session授权态 00：在线-授权态有效 01：下线-授权态失效 </span></span>
<span class="line"><span style="color:#C3E88D;">                       02：下线-主动退出 03：下线-在别处被登录</span><span style="color:#89DDFF;">&#39;</span></span></code></pre></div><p>反例：</p><div class="language-sql"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#89DDFF;">`</span><span style="color:#C3E88D;">session_status</span><span style="color:#89DDFF;">`</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">varchar</span><span style="color:#A6ACCD;">(</span><span style="color:#F78C6C;">2</span><span style="color:#A6ACCD;">) </span><span style="color:#C792EA;">COLLATE</span><span style="color:#A6ACCD;"> utf8_bin </span><span style="color:#F78C6C;">NOT NULL</span><span style="color:#A6ACCD;"> COMMENT </span><span style="color:#89DDFF;">&#39;</span><span style="color:#C3E88D;">session授权态</span><span style="color:#89DDFF;">&#39;</span></span></code></pre></div><p>并且，如果你的枚举类型在未来的版本有增加修改的话，也需要同时维护到<code>comment</code>后面。</p><h2 id="时间的类型选择⭐" tabindex="-1">时间的类型选择⭐ <a class="header-anchor" href="#时间的类型选择⭐" aria-label="Permalink to &quot;时间的类型选择⭐&quot;">​</a></h2><p>我们设计表的时候，一般都需要加通用时间的字段，如<code>create_time、modified_time</code>等等。那对于时间的类型，我们该如何选择呢？</p><p>对于 MySQL 来说，主要有<code>date、datetime、time、timestamp 和 year</code>。</p><ul><li>date ：表示日期值，格式<code>yyyy-mm-dd</code>，范围<code>1000-01-01 到 9999-12-31</code>，3 字节。</li><li>time ：表示时间值，格式 <code>hh:mm:ss</code>，范围<code>-838:59:59 到 838:59:59</code>，3 字节。</li><li>datetime：表示日期时间值，格式<code>yyyy-mm-dd hh:mm:ss</code>，范围<code>1000-01-01 00:00:00 到 9999-12-31 23:59:59</code>，8 字节，跟时区无关。</li><li>timestamp：表示时间戳值，格式<code>yyyymmddhhmmss</code>，范围<code>1970-01-01 00:00:01 到 2038-01-19 03:14:07</code>，4 字节，跟时区有关。</li><li>year：表示年份值，格式<code>yyyy</code>，范围<code>1901 到 2155</code>，1 字节。</li></ul><p>推荐优先使用<code>datetime</code>类型来保存日期和时间，因为存储范围更大，且跟时区无关。</p><h2 id="不建议使用存储过程、触发器" tabindex="-1">不建议使用存储过程、触发器 <a class="header-anchor" href="#不建议使用存储过程、触发器" aria-label="Permalink to &quot;不建议使用存储过程、触发器&quot;">​</a></h2><p><strong>什么是存储过程？</strong></p><p>已预编译为一个可执行过程的一个或多个 SQL 语句。</p><p><strong>什么是触发器？</strong></p><p>触发器，指一段代码，当触发某个事件时，自动执行这些代码。使用场景：</p><ul><li>可以通过数据库中的相关表实现级联更改。</li><li>实时监控某张表中的某个字段的更改而需要做出相应的处理。</li><li>例如可以生成某些业务的编号。</li><li>注意不要滥用，否则会造成数据库及应用程序的维护困难。</li></ul><p>对于 MYSQL 来说，存储过程、触发器等还不是很成熟， 并没有完善的出错记录处理，不建议使用。</p><h2 id="_1-n-关系的设计⭐" tabindex="-1">1:N 关系的设计⭐ <a class="header-anchor" href="#_1-n-关系的设计⭐" aria-label="Permalink to &quot;1:N 关系的设计⭐&quot;">​</a></h2><p>日常开发中，<code>1</code>对多的关系应该是非常常见的。比如一个班级有多个学生，一个部门有多个员工等等。这种情况的建表原则就是：在从表（<code>N</code>的这一方）创建一个字段，以字段作为外键指向主表（<code>1</code>的这一方）的主键。示意图如下:</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/PoF8jo1PmpxLwpugXhicDPDvgRXjFPRn4qjeHplyXzrmYvltuEptX4YqQhNSwAhJHCbYicibIvK22Xzp6IdvAunOw/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>学生表是多（<code>N</code>）的一方，会有个字段<code>class_id</code>保存班级表的主键。当然，一般不加外键约束哈，只是单纯保存这个关系而已。</p><p>有时候两张表存在<code>N:N</code>关系时，我们应该消除这种关系。通过增加第三张表，把<code>N:N</code>修改为两个 <code>1:N</code>。比如图书和读者，是一个典型的多对多的关系。一本书可以被多个读者借，一个读者又可以借多本书。我们就可以设计一个借书表，包含图书表的主键，以及读者的主键，以及借还标记等字段。</p><h2 id="大字段的存储" tabindex="-1">大字段的存储 <a class="header-anchor" href="#大字段的存储" aria-label="Permalink to &quot;大字段的存储&quot;">​</a></h2><blockquote><p>设计表的时候，我们尤其需要关注一些大字段，即占用较多存储空间的字段。比如用来记录用户评论的字段，又或者记录博客内容的字段，又或者保存合同数据的字段。如果直接把表字段设计成 text 类型的话，就会浪费存储空间，查询效率也不好。</p></blockquote><blockquote><p>在 MySQL 中，这种方式保存的设计方案，其实是不太合理的。这种非常大的数据，可以保存到<code>mongodb</code>中，然后，在业务表保存对应<code>mongodb</code>的<code>id</code>即可。</p></blockquote><blockquote><p>这种设计思想类似于，我们表字段保存图片时，为什么不是保存图片内容，而是直接保存图片 url 即可。</p></blockquote><h2 id="考虑是否需要分库分表" tabindex="-1">考虑是否需要分库分表 <a class="header-anchor" href="#考虑是否需要分库分表" aria-label="Permalink to &quot;考虑是否需要分库分表&quot;">​</a></h2><p><strong>什么是分库分表呢？</strong></p><ul><li>分库：就是一个数据库分成多个数据库，部署到不同机器。</li></ul><img src="https://mmbiz.qpic.cn/mmbiz_png/PoF8jo1PmpxLwpugXhicDPDvgRXjFPRn4xhvInqr13WcUAJrWsq4sqKHaBYalEPxFjfLnrh5b20bSVrWnDKNyLw/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片" style="zoom:50%;"><ul><li>分表：就是一个数据库表分成多个表。</li></ul><img src="https://mmbiz.qpic.cn/mmbiz_png/PoF8jo1PmpxLwpugXhicDPDvgRXjFPRn4ovicPfzsuKic6KPA7VoB66JFpwu5liahvdFdrxoRq2T9CL362qGWLwLxA/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片" style="zoom:50%;"><p>我们在设计表的时候，其实可以提前估算一下，是否需要做<strong>分库分表</strong>。比如一些用户信息，未来可能数据量到达百万甚至千万的话，就可以提前考虑分库分表。</p><blockquote><p><strong>为什么需要分库分表</strong>：数据量太大的话，SQL 的查询就会变慢。如果一个查询 SQL 没命中索引，千百万数据量级别的表可能会拖垮整个数据库。即使 SQL 命中了索引，如果表的数据量超过一千万的话，查询也是会明显变慢的。这是因为索引一般是 B+ 树结构，数据千万级别的话，B+ 树的高度会增高，查询就变慢啦。</p></blockquote><p>分库分表主要有水平拆分、垂直拆分的说法，拆分策略有<code>range 范围、hash 取模</code>。</p><h2 id="sql优化经验" tabindex="-1">SQL优化经验 <a class="header-anchor" href="#sql优化经验" aria-label="Permalink to &quot;SQL优化经验&quot;">​</a></h2><p>最后，跟大家聊一些写 SQL 的经验：</p><ul><li>查询 SQL 尽量不要使用<code>select *</code>，而是<code>select</code>具体字段。</li><li>如果知道查询结果只有一条或者只要最大/最小一条记录，建议用<code>limit 1</code>。</li><li>应尽量避免在<code>where</code>子句中使用<code>or</code>来连接条件。</li><li>注意优化<code>limit</code>深分页问题。</li><li>使用<code>where</code>条件限定要查询的数据，避免返回多余的行。</li><li>尽量避免在索引列上使用<code>mysql</code>的内置函数。</li><li>应尽量避免在 <code>where</code>子句中对字段进行表达式操作。</li><li>应尽量避免在<code>where</code>子句中使用<code>!=</code>或<code>&lt;&gt;</code>操作符。</li><li>使用联合索引时，注意索引列的顺序，一般遵循最左匹配原则。</li><li>对查询进行优化，应考虑在<code>where 及 order by</code>涉及的列上建立索引。</li><li>如果插入数据过多，考虑批量插入。</li><li>在适当的时候，使用覆盖索引。</li><li>使用 explain 分析 SQL 的计划。</li></ul><h1 id="建表15个技巧⭐" tabindex="-1">建表15个技巧⭐ <a class="header-anchor" href="#建表15个技巧⭐" aria-label="Permalink to &quot;建表15个技巧⭐&quot;">​</a></h1><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.8.30/202208262153006.png" alt="image-20220826215327853" style="zoom:67%;"><h2 id="_1-名字" tabindex="-1">1.名字 <a class="header-anchor" href="#_1-名字" aria-label="Permalink to &quot;1.名字&quot;">​</a></h2><p>建表的时候，给<code>表</code>、<code>字段</code>和<code>索引</code>起个好名字，真的太重要了。</p><h3 id="见名知意" tabindex="-1">见名知意 <a class="header-anchor" href="#见名知意" aria-label="Permalink to &quot;见名知意&quot;">​</a></h3><p>名字就像<code>表</code>、<code>字段</code>和<code>索引</code>的一张脸，可以给人留下第一印象。</p><p>好的名字，言简意赅，见名知意，让人心情愉悦，能够提高沟通和维护成本。</p><p>坏的名字，模拟两可，不知所云。而且显得杂乱无章，看得让人抓狂。</p><blockquote><p>**反例：**用户名称字段定义成：yong_hu_ming、用户_name、name、user_name_123456789</p></blockquote><p>你看了可能会一脸懵逼，这是什么骚操作？</p><blockquote><p>**正例：**用户名称字段定义成：user_name</p><p>温馨提醒一下，名字也不宜过长，尽量控制在<code>30</code>个字符以内。</p></blockquote><h3 id="_1-2-大小写" tabindex="-1"><strong>1.2 大小写</strong> <a class="header-anchor" href="#_1-2-大小写" aria-label="Permalink to &quot;**1.2 大小写**&quot;">​</a></h3><p>名字尽量都用<code>小写字母</code>，因为从视觉上，小写字母更容易让人读懂。</p><p><strong>反例：</strong></p><div class="language-apl"><button title="Copy Code" class="copy"></button><span class="lang">apl</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">字段名：PRODUCT_NAME、PRODUCT_name</span></span></code></pre></div><p>全部大写，看起来有点不太直观。而一部分大写，一部分小写，让人看着更不爽。</p><p><strong>正例：</strong></p><div class="language-apl"><button title="Copy Code" class="copy"></button><span class="lang">apl</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">字段名：product_name</span></span></code></pre></div><p>名字还是使用全小写字母，看着更舒服。</p><h3 id="_1-3-分隔符" tabindex="-1"><strong>1.3 分隔符</strong> <a class="header-anchor" href="#_1-3-分隔符" aria-label="Permalink to &quot;**1.3 分隔符**&quot;">​</a></h3><p>很多时候，名字为了让人好理解，有可能会包含多个单词。</p><p>那么，多个单词间的<code>分隔符</code>该用什么呢？</p><p><strong>反例：</strong></p><div class="language-sql"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">字段名：productname、productName、product </span><span style="color:#F78C6C;">name</span><span style="color:#A6ACCD;">、product@name</span></span></code></pre></div><p>单词间没有分隔，或者单词间用驼峰标识，或者单词间用空格分隔，或者单词间用@分隔，这几种方式都不太建议。</p><p><strong>正例：</strong></p><div class="language-sql"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">字段名：product_name</span></span></code></pre></div><p>强烈建议大家在单词间用<code>_</code>分隔。</p><h3 id="_1-4-表名" tabindex="-1"><strong>1.4 表名</strong> <a class="header-anchor" href="#_1-4-表名" aria-label="Permalink to &quot;**1.4 表名**&quot;">​</a></h3><p>对于表名，在言简意赅，见名知意的基础之上，建议带上<code>业务前缀</code>。</p><p>如果是订单相关的业务表，可以在表名前面加个前缀：<code>order_</code>。</p><p>例如：order_pay、order_pay_detail等。</p><p>如果是商品相关的业务表，可以在表名前面加个前缀：<code>product_</code>。</p><p>例如：product_spu，product_sku等。</p><p>这样做的好处是为了方便归类，把相同业务的表，可以非常快速的聚集到一起。</p><p>另外，还有有个好处是，如果哪天有非订单的业务，比如：金融业务，也需要建一个名字叫做pay的表，可以取名：finance_pay，就能非常轻松的区分。</p><p>这样就不会出现<code>同名表</code>的情况。</p><h3 id="_1-5-字段名称" tabindex="-1"><strong>1.5 字段名称</strong> <a class="header-anchor" href="#_1-5-字段名称" aria-label="Permalink to &quot;**1.5 字段名称**&quot;">​</a></h3><p><code>字段名称</code>是开发人员发挥空间最大，但也最容易发生混乱的地方。</p><p>比如有些表，使用flag表示状态，另外的表用status表示状态。</p><p>可以统一一下，使用status表示状态。</p><p>如果一个表使用了另一个表的主键，可以在另一张表的名后面，加<code>_id</code>或<code>_sys_no</code>，例如：</p><p>在product_sku表中有个字段，是product_spu表的主键，这时候可以取名：product_spu_id或product_spu_sys_no。</p><p>还有创建时间，可以统一成：create_time，修改时间统一成：update_time。</p><p>删除状态固定为：delete_status。</p><p>其实还有很多公共字段，在不同的表之间，可以使用全局统一的命名规则，定义成相同的名称，以便于大家好理解。</p><h3 id="_1-6-索引名" tabindex="-1"><strong>1.6 索引名</strong> <a class="header-anchor" href="#_1-6-索引名" aria-label="Permalink to &quot;**1.6 索引名**&quot;">​</a></h3><p>在数据库中，索引有很多种，包括：主键、普通索引、唯一索引、联合索引等。</p><p>每张表的主键只有一个，一般使用：<code>id</code>或者<code>sys_no</code>命名。</p><p>普通索引和联合索引，其实是一类。在建立该类索引时，可以加<code>ix_</code>前缀，比如：ix_product_status。</p><p>唯一索引，可以加<code>ux_</code>前缀，比如：ux_product_code。</p><h2 id="_2-字段类型" tabindex="-1">2.字段类型 <a class="header-anchor" href="#_2-字段类型" aria-label="Permalink to &quot;2.字段类型&quot;">​</a></h2><p>在设计表时，我们在选择<code>字段类型</code>时，可发挥空间很大。</p><p>时间格式的数据有：date、datetime和timestamp等等可以选择。</p><p>字符类型的数据有：varchar、char、text等可以选择。</p><p>数字类型的数据有：int、bigint、smallint、tinyint等可以选择。</p><p>说实话，选择很多，有时候是一件好事，也可能是一件坏事。</p><p>如何选择一个<code>合适</code>的字段类型，变成了我们不得不面对的问题。</p><p>如果字段类型选大了，比如：原本只有1-10之间的10个数字，结果选了<code>bigint</code>，它占<code>8</code>个字节。</p><p>其实，1-10之间的10个数字，每个数字<code>1</code>个字节就能保存，选择<code>tinyint</code>更为合适。</p><p>这样会白白浪费7个字节的空间。</p><p>如果字段类型择小了，比如：一个18位的id字段，选择了<code>int</code>类型，最终数据会保存失败。</p><p>所以选择一个合适的字段类型，还是非常重要的一件事情。</p><p>以下原则可以参考一下：</p><ol><li>尽可能选择占用存储空间小的字段类型，在满足正常业务需求的情况下，从小到大，往上选。</li><li>如果字符串长度固定，或者差别不大，可以选择char类型。如果字符串长度差别较大，可以选择varchar类型。</li><li>是否字段，可以选择bit类型。</li><li>枚举字段，可以选择tinyint类型。</li><li>主键字段，可以选择bigint类型。</li><li>金额字段，可以选择decimal类型。</li><li>时间字段，可以选择timestamp或datetime类型。</li></ol><h2 id="_3-字段长度" tabindex="-1">3.字段长度 <a class="header-anchor" href="#_3-字段长度" aria-label="Permalink to &quot;3.字段长度&quot;">​</a></h2><p>前面我们已经定义好了<code>字段名称</code>，选择了合适的<code>字段类型</code>，接下来，需要重点关注的是<code>字段长度</code>了。</p><p>比如：varchar(20)，biginit(20)等。</p><p>那么问题来了，<code>varchar</code>代表的是<code>字节</code>长度，还是<code>字符</code>长度呢？</p><p>答：在mysql中除了<code>varchar</code>和<code>char</code>是代表<code>字符</code>长度之外，其余的类型都是代表<code>字节</code>长度。</p><p>biginit(n) 这个<code>n</code>表示什么意思呢？</p><p>假如我们定义的字段类型和长度是：bigint(4)，bigint实际长度是<code>8</code>个字节。</p><p>现在有个数据a=1，a显示4个字节，所以在不满4个字节时前面填充0（前提是该字段设置了zerofill属性），比如：0001。</p><p>当满了4个字节时，比如现在数据是a=123456，它会按照实际的长度显示，比如：123456。</p><p>但需要注意的是，有些mysql客户端即使满了4个字节，也可能只显示4个字节的内容，比如会显示成：1234。</p><p>所以bigint(4)，这里的4表示显示的长度为4个字节，实际长度还是占8个字节。</p><h2 id="_4-字段个数" tabindex="-1">4.字段个数 <a class="header-anchor" href="#_4-字段个数" aria-label="Permalink to &quot;4.字段个数&quot;">​</a></h2><p>我们在建表的时候，一定要对<code>字段个数</code>做一些限制。</p><p>我之前见过有人创建的表，有几十个，甚至上百个字段，表中保存的数据非常大，查询效率很低。</p><p>如果真有这种情况，可以将一张<code>大表</code>拆成多张<code>小表</code>，这几张表的主键相同。</p><p>建议每表的字段个数，不要超过<code>20</code>个。</p><h2 id="_5-主键" tabindex="-1">5. 主键 <a class="header-anchor" href="#_5-主键" aria-label="Permalink to &quot;5. 主键&quot;">​</a></h2><p>在创建表时，一定要创建<code>主键</code>。</p><p>因为主键自带了主键索引，相比于其他索引，主键索引的查询效率最高，因为它不需要回表。</p><p>此外，主键还是天然的<code>唯一索引</code>，可以根据它来判重。</p><p>在<code>单个</code>数据库中，主键可以通过<code>AUTO_INCREMENT</code>，设置成<code>自动增长</code>的。</p><p>但在<code>分布式</code>数据库中，特别是做了分库分表的业务库中，主键最好由外部算法(比如：雪花算法）生成，它能够保证生成的id是全局唯一的。</p><p>除此之外，主键建议保存跟业务无关的值，减少业务耦合性，方便今后的扩展。</p><p>不过我也见过，有些一对一的表关系，比如：用户表和用户扩展表，在保存数据时是一对一的关系。</p><p>这样，用户扩展表的主键，可以直接保存用户表的主键。</p><h2 id="_6-存储引擎" tabindex="-1">6.存储引擎 <a class="header-anchor" href="#_6-存储引擎" aria-label="Permalink to &quot;6.存储引擎&quot;">​</a></h2><p>在<code>mysql8</code>以前的版本，默认的存储引擎是<code>myslam</code>，而<code>mysql8</code>以后的版本，默认的存储引擎变成了<code>innodb</code>。</p><p>之前我们还在创建表时，还一直纠结要选哪种存储引擎？</p><p><code>myslam</code>的索引和数据分开存储，而有利于查询，但它不支持事务和外键等功能。</p><p>而<code>innodb</code>虽说查询性能，稍微弱一点，但它支持事务和外键等，功能更强大一些。</p><p>以前的建议是：读多写少的表，用myslam存储引擎。而写多读多的表，用innodb。</p><p>但虽说mysql对innodb存储引擎性能的不断优化，现在myslam和innodb查询性能相差已经越来越小。</p><p>所以，建议我们在使用<code>mysql8</code>以后的版本时，直接使用默认的<code>innodb</code>存储引擎即可，无需额外修改存储引擎。</p><h2 id="_7-not-null" tabindex="-1">7. NOT NULL <a class="header-anchor" href="#_7-not-null" aria-label="Permalink to &quot;7. NOT NULL&quot;">​</a></h2><p>在创建字段时，需要选择该字段是否允许为<code>NULL</code>。</p><p>我们在定义字段时，应该尽可能明确该字段<code>NOT NULL</code>。</p><p>为什么呢？</p><p>我们主要以innodb存储引擎为例，myslam存储引擎没啥好说的。</p><p>主要有以下原因：</p><ol><li>在innodb中，需要额外的空间存储null值，需要占用更多的空间。</li><li>null值可能会导致索引失效。</li><li>null值只能用<code>is null</code>或者<code>is not null</code>判断，用<code>=号</code>判断永远返回false。</li></ol><p>因此，建议我们在定义字段时，能定义成NOT NULL，就定义成NOT NULL。</p><p>但如果某个字段直接定义成NOT NULL，万一有些地方忘了给该字段写值，就会<code>insert</code>不了数据。</p><p>这也算合理的情况。</p><p>但有一种情况是，系统有新功能上线，新增了字段。上线时一般会先执行sql脚本，再部署代码。</p><p>由于老代码中，不会给新字段赋值，则insert数据时，也会报错。</p><p>由此，非常有必要给NOT NULL的字段设置默认值，特别是后面新增的字段。</p><p>例如：</p><div class="language-sql"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#F78C6C;">alter</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">table</span><span style="color:#A6ACCD;"> product_sku </span><span style="color:#F78C6C;">add</span><span style="color:#A6ACCD;"> column  brand_id </span><span style="color:#C792EA;">int</span><span style="color:#A6ACCD;">(</span><span style="color:#F78C6C;">10</span><span style="color:#A6ACCD;">) </span><span style="color:#F78C6C;">not null</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">default</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">0</span><span style="color:#A6ACCD;">;</span></span></code></pre></div><h2 id="_8-外键" tabindex="-1">8.外键 <a class="header-anchor" href="#_8-外键" aria-label="Permalink to &quot;8.外键&quot;">​</a></h2><p>在mysql中，是存在<code>外键</code>的。</p><p>外键存在的主要作用是：保证数据的<code>一致性</code>和<code>完整性</code>。</p><p>例如：</p><div class="language-sql"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#F78C6C;">create</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">table</span><span style="color:#A6ACCD;"> </span><span style="color:#82AAFF;">class</span><span style="color:#A6ACCD;"> (</span></span>
<span class="line"><span style="color:#A6ACCD;">  id </span><span style="color:#C792EA;">int</span><span style="color:#A6ACCD;">(</span><span style="color:#F78C6C;">10</span><span style="color:#A6ACCD;">) </span><span style="color:#C792EA;">primary key</span><span style="color:#A6ACCD;"> auto_increment,</span></span>
<span class="line"><span style="color:#A6ACCD;">  cname </span><span style="color:#C792EA;">varchar</span><span style="color:#A6ACCD;">(</span><span style="color:#F78C6C;">15</span><span style="color:#A6ACCD;">)</span></span>
<span class="line"><span style="color:#A6ACCD;">);</span></span></code></pre></div><p>有个班级表class。</p><p>然后有个student表：</p><div class="language-sql"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#F78C6C;">create</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">table</span><span style="color:#A6ACCD;"> </span><span style="color:#82AAFF;">student</span><span style="color:#A6ACCD;">(</span></span>
<span class="line"><span style="color:#A6ACCD;">  id </span><span style="color:#C792EA;">int</span><span style="color:#A6ACCD;">(</span><span style="color:#F78C6C;">10</span><span style="color:#A6ACCD;">) </span><span style="color:#C792EA;">primary key</span><span style="color:#A6ACCD;"> auto_increment,</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#F78C6C;">name</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">varchar</span><span style="color:#A6ACCD;">(</span><span style="color:#F78C6C;">15</span><span style="color:#A6ACCD;">) </span><span style="color:#F78C6C;">not null</span><span style="color:#A6ACCD;">,</span></span>
<span class="line"><span style="color:#A6ACCD;">  gender </span><span style="color:#C792EA;">varchar</span><span style="color:#A6ACCD;">(</span><span style="color:#F78C6C;">10</span><span style="color:#A6ACCD;">) </span><span style="color:#F78C6C;">not null</span><span style="color:#A6ACCD;">,</span></span>
<span class="line"><span style="color:#A6ACCD;">  cid </span><span style="color:#C792EA;">int</span><span style="color:#A6ACCD;">,</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#C792EA;">foreign key</span><span style="color:#A6ACCD;">(cid) </span><span style="color:#C792EA;">references</span><span style="color:#A6ACCD;"> class(id)</span></span>
<span class="line"><span style="color:#A6ACCD;">);</span></span></code></pre></div><p>其中student表中的cid字段，保存的class表的id，这时通过<code>foreign key</code>增加了一个外键。</p><p>这时，如果你直接通过student表的id删除数据，会报异常：</p><div class="language-sql"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">a </span><span style="color:#C792EA;">foreign key</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">constraint</span><span style="color:#A6ACCD;"> fails</span></span></code></pre></div><p>必须要先删除class表对于的cid那条数据，再删除student表的数据才行，这样能够保证数据的一致性和完整性。</p><blockquote><p>顺便说一句：只有存储引擎是innodb时，才能使用外键。</p></blockquote><p>如果只有两张表的关联还好，但如果有十几张表都建了外键关联，每删除一次主表，都需要同步删除十几张子表，很显然性能会非常差。</p><p>因此，互联网系统中，一般建议不使用外键。因为这类系统更多的是为了性能考虑，宁可牺牲一点数据一致性和完整性。</p><p>除了<code>外键</code>之外，<code>存储过程</code>和<code>触发器</code>也不太建议使用，他们都会影响性能。</p><h2 id="_9-索引" tabindex="-1">9. 索引 <a class="header-anchor" href="#_9-索引" aria-label="Permalink to &quot;9. 索引&quot;">​</a></h2><p>在建表时，除了指定<code>主键索引</code>之外，还需要创建一些<code>普通索引</code>。</p><p>例如：</p><div class="language-sql"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#F78C6C;">create</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">table</span><span style="color:#A6ACCD;"> </span><span style="color:#82AAFF;">product_sku</span><span style="color:#A6ACCD;">(</span></span>
<span class="line"><span style="color:#A6ACCD;">  id </span><span style="color:#C792EA;">int</span><span style="color:#A6ACCD;">(</span><span style="color:#F78C6C;">10</span><span style="color:#A6ACCD;">) </span><span style="color:#C792EA;">primary key</span><span style="color:#A6ACCD;"> auto_increment,</span></span>
<span class="line"><span style="color:#A6ACCD;">  spu_id </span><span style="color:#C792EA;">int</span><span style="color:#A6ACCD;">(</span><span style="color:#F78C6C;">10</span><span style="color:#A6ACCD;">) </span><span style="color:#F78C6C;">not null</span><span style="color:#A6ACCD;">,</span></span>
<span class="line"><span style="color:#A6ACCD;">  brand_id </span><span style="color:#C792EA;">int</span><span style="color:#A6ACCD;">(</span><span style="color:#F78C6C;">10</span><span style="color:#A6ACCD;">) </span><span style="color:#F78C6C;">not null</span><span style="color:#A6ACCD;">,</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#F78C6C;">name</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">varchar</span><span style="color:#A6ACCD;">(</span><span style="color:#F78C6C;">15</span><span style="color:#A6ACCD;">) </span><span style="color:#F78C6C;">not null</span></span>
<span class="line"><span style="color:#A6ACCD;">);</span></span></code></pre></div><p>在创建商品表时，使用spu_id（商品组表）和brand_id（品牌表）的id。</p><p>像这类保存其他表id的情况，可以增加普通索引：</p><div class="language-sql"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#F78C6C;">create</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">table</span><span style="color:#A6ACCD;"> </span><span style="color:#82AAFF;">product_sku</span><span style="color:#A6ACCD;"> (</span></span>
<span class="line"><span style="color:#A6ACCD;">  id </span><span style="color:#C792EA;">int</span><span style="color:#A6ACCD;">(</span><span style="color:#F78C6C;">10</span><span style="color:#A6ACCD;">) </span><span style="color:#C792EA;">primary key</span><span style="color:#A6ACCD;"> auto_increment,</span></span>
<span class="line"><span style="color:#A6ACCD;">  spu_id </span><span style="color:#C792EA;">int</span><span style="color:#A6ACCD;">(</span><span style="color:#F78C6C;">10</span><span style="color:#A6ACCD;">) </span><span style="color:#F78C6C;">not null</span><span style="color:#A6ACCD;">,</span></span>
<span class="line"><span style="color:#A6ACCD;">  brand_id </span><span style="color:#C792EA;">int</span><span style="color:#A6ACCD;">(</span><span style="color:#F78C6C;">10</span><span style="color:#A6ACCD;">) </span><span style="color:#F78C6C;">not null</span><span style="color:#A6ACCD;">,</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#F78C6C;">name</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">varchar</span><span style="color:#A6ACCD;">(</span><span style="color:#F78C6C;">15</span><span style="color:#A6ACCD;">) </span><span style="color:#F78C6C;">not null</span><span style="color:#A6ACCD;">,</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#F78C6C;">KEY</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">`</span><span style="color:#C3E88D;">ix_spu_id</span><span style="color:#89DDFF;">`</span><span style="color:#A6ACCD;"> (</span><span style="color:#89DDFF;">`</span><span style="color:#C3E88D;">spu_id</span><span style="color:#89DDFF;">`</span><span style="color:#A6ACCD;">) </span><span style="color:#F78C6C;">USING</span><span style="color:#A6ACCD;"> BTREE,</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#F78C6C;">KEY</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">`</span><span style="color:#C3E88D;">ix_brand_id</span><span style="color:#89DDFF;">`</span><span style="color:#A6ACCD;"> (</span><span style="color:#89DDFF;">`</span><span style="color:#C3E88D;">brand_id</span><span style="color:#89DDFF;">`</span><span style="color:#A6ACCD;">) </span><span style="color:#F78C6C;">USING</span><span style="color:#A6ACCD;"> BTREE</span></span>
<span class="line"><span style="color:#A6ACCD;">);</span></span></code></pre></div><p>后面查表的时候，效率更高。</p><p>但索引字段也不能建的太多，可能会影响保存数据的效率，因为索引需要额外的存储空间。</p><p>建议单表的索引个数不要超过：<code>5</code>个。</p><p>如果在建表时，发现索引个数超过5个了，可以删除部分<code>普通索引</code>，改成<code>联合索引</code>。</p><p>顺便说一句：在创建联合索引的时候，需要使用注意<code>最左匹配原则</code>，不然，建的联合索引效率可能不高。</p><p>对于数据重复率非常高的字段，比如：状态，不建议单独创建普通索引。因为即使加了索引，如果mysql发现<code>全表扫描</code>效率更高，可能会导致索引失效。</p><p>如果你对索引失效问题比较感兴趣，可以看看我的另一篇文章《<a href="https://mp.weixin.qq.com/s?__biz=MzkwNjMwMTgzMQ==&amp;mid=2247491626&amp;idx=1&amp;sn=18fc949c06f04fe8f4c29b6fc5c66f9c&amp;chksm=c0e838c2f79fb1d45c6f9b2ab188bb4663414690bab0718a7d46beb875e6b83e5e67ec27d2ff&amp;token=660773166&amp;lang=zh_CN&amp;scene=21#wechat_redirect" target="_blank" rel="noreferrer">聊聊索引失效的10种场景，太坑了</a>》，里面有非常详细的介绍。</p><h2 id="_10-时间字段" tabindex="-1">10.时间字段 <a class="header-anchor" href="#_10-时间字段" aria-label="Permalink to &quot;10.时间字段&quot;">​</a></h2><p><code>时间字段</code>的类型，我们可以选择的范围还是比较多的，目前mysql支持：date、datetime、timestamp、varchar等。</p><p><code>varchar</code>类型可能是为了跟接口保持一致，接口中的时间类型是String。</p><p>但如果哪天我们要通过时间范围查询数据，效率会非常低，因为这种情况没法走索引。</p><p><code>date</code>类型主要是为了保存<code>日期</code>，比如：2020-08-20，不适合保存<code>日期和时间</code>，比如：2020-08-20 12:12:20。</p><p>而<code>datetime</code>和<code>timestamp</code>类型更适合我们保存<code>日期和时间</code>。</p><p>但它们有略微区别。</p><ul><li><code>timestamp</code>：用4个字节来保存数据，它的取值范围为<code>1970-01-01 00:00:01</code> UTC ~ <code>2038-01-19 03:14:07</code>。此外，它还跟时区有关。</li><li><code>datetime</code>：用8个字节来保存数据，它的取值范围为<code>1000-01-01 00:00:00</code> ~ <code>9999-12-31 23:59:59</code>。它跟时区无关。</li></ul><p>优先推荐使用<code>datetime</code>类型保存日期和时间，可以保存的时间范围更大一些。</p><blockquote><p>温馨提醒一下，在给时间字段设置默认值是，建议不要设置成：<code>0000-00-00 00:00:00</code>，不然查询表时可能会因为转换不了，而直接报错。</p></blockquote><h2 id="_11-金额字段" tabindex="-1">11.金额字段 <a class="header-anchor" href="#_11-金额字段" aria-label="Permalink to &quot;11.金额字段&quot;">​</a></h2><p>mysql中有多个字段可以表示浮点数：float、double、decimal等。</p><p>而<code>float</code>和<code>double</code>可能会丢失精度，因此推荐大家使用<code>decimal</code>类型保存金额。</p><p>一般我们是这样定义浮点数的：decimal(m,n)。</p><p>其中<code>n</code>是指<code>小数</code>的长度，而<code>m</code>是指<code>整数加小数</code>的总长度。</p><p>假如我们定义的金额类型是这样的：decimal(10,2)，则表示整数长度是8位，并且保留2位小数。</p><h2 id="_12-唯一索引" tabindex="-1">12.唯一索引 <a class="header-anchor" href="#_12-唯一索引" aria-label="Permalink to &quot;12.唯一索引&quot;">​</a></h2><p><code>唯一索引</code>在我们实际工作中，使用频率相当高。</p><p>你可以给单个字段，加唯一索引，比如：组织机构code。</p><p>也可以给多个字段，加一个联合的唯一索引，比如：分类编号、单位、规格等。</p><p>单个的唯一索引还好，但如果是联合的唯一索引，字段值出现null时，则唯一性约束可能会失效。</p><p>关于唯一索引失效的问题，感兴趣的小伙伴可以看看我的另一篇文章《<a href="https://mp.weixin.qq.com/s?__biz=MzkwNjMwMTgzMQ==&amp;mid=2247497090&amp;idx=1&amp;sn=53b81535a9815853382c3a4bff8c844b&amp;chksm=c0e82d6af79fa47ccfece23a8b0ad46ef6c647f1d2f961823eed181732c47e250ed0cbcfe6fd&amp;token=1169141359&amp;lang=zh_CN&amp;scene=21#wechat_redirect" target="_blank" rel="noreferrer">明明加了唯一索引，为什么还是产生重复数据？</a>》。</p><blockquote><p>创建唯一索引时，相关字段一定不能包含null值，否则唯一性会失效。</p></blockquote><h2 id="_13-字符集" tabindex="-1">13.字符集 <a class="header-anchor" href="#_13-字符集" aria-label="Permalink to &quot;13.字符集&quot;">​</a></h2><p>mysql中支持的<code>字符集</code>有很多，常用的有：latin1、utf-8、utf8mb4、GBK等。</p><p>这4种字符集情况如下：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.8.30/202208262249977.png" alt="image-20220826224939852" style="zoom:80%;"><p><code>latin1</code>容易出现乱码问题，在实际项目中使用比较少。</p><p>而<code>GBK</code>支持中文，但不支持国际通用字符，在实际项目中使用也不多。</p><p>从目前来看，mysql的字符集使用最多的还是：<code>utf-8</code>和<code>utf8mb4</code>。</p><p>其中<code>utf-8</code>占用3个字节，比<code>utf8mb4</code>的4个字节，占用更小的存储空间。</p><p>但utf-8有个问题：即无法存储emoji表情，因为emoji表情一般需要4个字节。</p><p>由此，使用utf-8字符集，保存emoji表情时，数据库会直接报错。</p><p>所以，建议在建表时字符集设置成：<code>utf8mb4</code>，会省去很多不必要的麻烦。</p><h2 id="_14-排序规则" tabindex="-1">14. 排序规则 <a class="header-anchor" href="#_14-排序规则" aria-label="Permalink to &quot;14. 排序规则&quot;">​</a></h2><p>不知道，你关注过没，在mysql中创建表时，有个<code>COLLATE</code>参数可以设置。</p><p>例如：</p><div class="language-sql"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#F78C6C;">CREATE</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">TABLE</span><span style="color:#A6ACCD;"> `</span><span style="color:#82AAFF;">order</span><span style="color:#A6ACCD;">` (</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#89DDFF;">`</span><span style="color:#C3E88D;">id</span><span style="color:#89DDFF;">`</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">bigint</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">NOT NULL</span><span style="color:#A6ACCD;"> AUTO_INCREMENT,</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#89DDFF;">`</span><span style="color:#C3E88D;">code</span><span style="color:#89DDFF;">`</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">varchar</span><span style="color:#A6ACCD;">(</span><span style="color:#F78C6C;">20</span><span style="color:#A6ACCD;">) </span><span style="color:#C792EA;">COLLATE</span><span style="color:#A6ACCD;"> utf8mb4_bin </span><span style="color:#F78C6C;">NOT NULL</span><span style="color:#A6ACCD;">,</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#89DDFF;">`</span><span style="color:#C3E88D;">name</span><span style="color:#89DDFF;">`</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">varchar</span><span style="color:#A6ACCD;">(</span><span style="color:#F78C6C;">30</span><span style="color:#A6ACCD;">) </span><span style="color:#C792EA;">COLLATE</span><span style="color:#A6ACCD;"> utf8mb4_bin </span><span style="color:#F78C6C;">NOT NULL</span><span style="color:#A6ACCD;">,</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#C792EA;">PRIMARY KEY</span><span style="color:#A6ACCD;"> (</span><span style="color:#89DDFF;">`</span><span style="color:#C3E88D;">id</span><span style="color:#89DDFF;">`</span><span style="color:#A6ACCD;">),</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#F78C6C;">UNIQUE</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">KEY</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">`</span><span style="color:#C3E88D;">un_code</span><span style="color:#89DDFF;">`</span><span style="color:#A6ACCD;"> (</span><span style="color:#89DDFF;">`</span><span style="color:#C3E88D;">code</span><span style="color:#89DDFF;">`</span><span style="color:#A6ACCD;">),</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#F78C6C;">KEY</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">`</span><span style="color:#C3E88D;">un_code_name</span><span style="color:#89DDFF;">`</span><span style="color:#A6ACCD;"> (</span><span style="color:#89DDFF;">`</span><span style="color:#C3E88D;">code</span><span style="color:#89DDFF;">`</span><span style="color:#A6ACCD;">,</span><span style="color:#89DDFF;">`</span><span style="color:#C3E88D;">name</span><span style="color:#89DDFF;">`</span><span style="color:#A6ACCD;">) </span><span style="color:#F78C6C;">USING</span><span style="color:#A6ACCD;"> BTREE,</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#F78C6C;">KEY</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">`</span><span style="color:#C3E88D;">idx_name</span><span style="color:#89DDFF;">`</span><span style="color:#A6ACCD;"> (</span><span style="color:#89DDFF;">`</span><span style="color:#C3E88D;">name</span><span style="color:#89DDFF;">`</span><span style="color:#A6ACCD;">)</span></span>
<span class="line"><span style="color:#A6ACCD;">) ENGINE</span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;">InnoDB AUTO_INCREMENT</span><span style="color:#89DDFF;">=</span><span style="color:#F78C6C;">5</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">DEFAULT</span><span style="color:#A6ACCD;"> CHARSET</span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;">utf8mb4 </span><span style="color:#C792EA;">COLLATE</span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;">utf8mb4_bin</span></span></code></pre></div><p>它是用来设置<code>排序规则</code>的。</p><p>字符排序规则跟字符集有关，比如：字符集如果是<code>utf8mb4</code>，则字符排序规则也是以：<code>utf8mb4_</code>开头的，常用的有：<code>utf8mb4_general_ci</code>、<code>utf8mb4_bin</code>等。</p><blockquote><p>其中utf8mb4_general_ci排序规则，对字母的大小写不敏感。说得更直白一点，就是不区分大小写。</p><p>而utf8mb4_bin排序规则，对字符大小写敏感，也就是区分大小写。</p></blockquote><p>说实话，这一点还是非常重要的。</p><p>假如order表中现在有一条记录，name的值是大写的YOYO，但我们用小写的yoyo去查，例如：</p><div class="language-sql"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#F78C6C;">select</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">*</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">from</span><span style="color:#A6ACCD;"> order </span><span style="color:#F78C6C;">where</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">name</span><span style="color:#89DDFF;">=</span><span style="color:#89DDFF;">&#39;</span><span style="color:#C3E88D;">yoyo</span><span style="color:#89DDFF;">&#39;</span><span style="color:#A6ACCD;">;</span></span></code></pre></div><p>如果字符排序规则是utf8mb4_general_ci，则可以查出大写的YOYO的那条数据。</p><p>如果字符排序规则是utf8mb4_bin，则查不出来。</p><p>由此，字符排序规则一定要根据实际的业务场景选择，否则容易出现问题。</p><h2 id="_15-大字段" tabindex="-1">15.大字段 <a class="header-anchor" href="#_15-大字段" aria-label="Permalink to &quot;15.大字段&quot;">​</a></h2><p>我们在创建表时，对一些特殊字段，要额外关注，比如：<code>大字段</code>，即占用较多存储空间的字段。比如：用户的评论，这就属于一个大字段，但这个字段可长可短。但一般会对评论的总长度做限制，比如：最多允许输入500个字符。如果直接定义成<code>text</code>类型，可能会浪费存储空间，所以建议将这类字段定义成<code>varchar</code>类型的存储效率更高。当然，我还见过更大的字段，即该字段直接保存合同数据。一个合同可能会占<code>几Mb</code>。在mysql中保存这种数据，从系统设计的角度来说，本身就不太合理。</p><blockquote><p>像合同这种非常大的数据，可以保存到<code>mongodb</code>中，然后在mysql的业务表中，保存mongodb表的id。</p></blockquote><h1 id="如何设计数据库" tabindex="-1">如何设计数据库 <a class="header-anchor" href="#如何设计数据库" aria-label="Permalink to &quot;如何设计数据库&quot;">​</a></h1><h2 id="范式和反范式" tabindex="-1">范式和反范式 <a class="header-anchor" href="#范式和反范式" aria-label="Permalink to &quot;范式和反范式&quot;">​</a></h2><p>优秀的库表设计是高性能数据库的基础。如何才能设计出高性能的库表结构呢？这里必须要提到数据库范式。范式是基础规范，反范式是针对性设计。</p><h3 id="_1-范式" tabindex="-1">1 范式 <a class="header-anchor" href="#_1-范式" aria-label="Permalink to &quot;1 范式&quot;">​</a></h3><p>范式是设计数据库结构过程中所要遵循的规则和指导方法</p><p>其实范式有很多，目前关系数据库有六种范式：第一范式（1NF）、第二范式（2NF）、第三范式（3NF）、巴斯-科德范式（BCNF）、第四范式(4NF）和第五范式（5NF，又称完美范式）。满足最低要求的范式是第一范式（1NF）。在第一范式的基础上进一步满足更多规范要求的称为第二范式（2NF），其余范式以次类推。一般来说，数据库只需满足第三范式(3NF）就行了。但是一般我们就用到前三个范式</p><h4 id="第一范式-确保每列保持原子性" tabindex="-1">第一范式(确保每列保持原子性) <a class="header-anchor" href="#第一范式-确保每列保持原子性" aria-label="Permalink to &quot;第一范式(确保每列保持原子性)&quot;">​</a></h4><p>第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值，就说明该数据库表满足了第一范式。</p><p>第一范式的合理遵循需要根据系统的实际需求来定。比如某些数据库系统中需要 用到“地址”这个属性，本来直接将“地址”属性设计成一个数据库表的字段就行。但是如果系统经常会访问“地址”属性中的“城市”部分，那么就</p><p>非要将“地址”这个属 性重新拆分为省份、城市、详细地址等多个部分进行存储，这样在对地址中某一 部分操作的时候将非常方便。这样设计才算满足了数据库的第一范式，如下表所 示。</p><p>上表所示的用户信息遵循了第一范式的要求，这样在对用户使用城市进行分类的 时候就非常方便，也提高了数据库的性能。</p><h4 id="第二范式-确保表中的每列都和主键相关" tabindex="-1">第二范式(确保表中的每列都和主键相关) <a class="header-anchor" href="#第二范式-确保表中的每列都和主键相关" aria-label="Permalink to &quot;第二范式(确保表中的每列都和主键相关)&quot;">​</a></h4><p>第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一 列都和主键相关，而不能只与主键的某一部分相关（主要针对联合主键而言）。也就是说在一个数据库表中，一个表中只能保存一种数据，</p><p>不可以把多种数据 保存在同一张数据库表中。</p><p>比如要设计一个订单信息表，因为订单中可能会有多种商品，所以要将订单编 号和商品编号作为数据库表的联合主键。</p><h4 id="第三范式-确保每列都和主键列直接相关-而不是间接相关" tabindex="-1">第三范式(确保每列都和主键列直接相关,而不是间接相关) <a class="header-anchor" href="#第三范式-确保每列都和主键列直接相关-而不是间接相关" aria-label="Permalink to &quot;第三范式(确保每列都和主键列直接相关,而不是间接相关)&quot;">​</a></h4><p>第三范式需要确保数据表中的每一列数据都和主键直接相关，而不能间接相关。</p><p>比如在设计一个订单数据表的时候，可以将客户编号作为一个外键和订单表建立 相应的关系。而不可以在订单表中添加关于客户其它信息（比如姓名、所属公司 等）的字段。</p><p>总结：1NF：无重复的列，属性不可以拆分（强调列的原子性，比如家庭电话和个人电话需要拆开）</p><p>2NF：属性完全依赖于主键</p><p>3NF：属性不传递依赖于其他非主属性</p><h3 id="_2-范式的优点缺点" tabindex="-1">2 范式的优点缺点 <a class="header-anchor" href="#_2-范式的优点缺点" aria-label="Permalink to &quot;2 范式的优点缺点&quot;">​</a></h3><p>优点：避免数据冗余，减少数据的空间，数据变更速度更快</p><p>缺点：范式等级越高，表的数量越多，获取数据时表关联过多，性能较差</p><h3 id="_3-反范式" tabindex="-1">3 反范式 <a class="header-anchor" href="#_3-反范式" aria-label="Permalink to &quot;3 反范式&quot;">​</a></h3><p>范式设计的表无法满足性能需求时，需要根据业务场景，在范式的基础上灵活设计</p><p>1.业务场景</p><p>2.响应时间</p><p>3.字段冗余</p><h3 id="_4-反范式和范式的对比" tabindex="-1">4 反范式和范式的对比 <a class="header-anchor" href="#_4-反范式和范式的对比" aria-label="Permalink to &quot;4 反范式和范式的对比&quot;">​</a></h3><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaPfaDVSUoJFrAzQXa5U9NpBmCgIPBxWIvFPtNvYPicOPR7jKAIIia6javTvgGN5jbiaicRTp9XCq1QaerMJlBqcmBw/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><h2 id="基础规范和命名规范" tabindex="-1">基础规范和命名规范 <a class="header-anchor" href="#基础规范和命名规范" aria-label="Permalink to &quot;基础规范和命名规范&quot;">​</a></h2><h3 id="_1-基础规范" tabindex="-1">1 基础规范 <a class="header-anchor" href="#_1-基础规范" aria-label="Permalink to &quot;1 基础规范&quot;">​</a></h3><p>想要发挥 MySQL 的最佳性能，需要遵循 3 个基本使用原则。</p><p>1.回归存储的基本职能（MySQL 数据库只用于数据的存储，不进行数据的复杂计算，不承载业务逻辑，确保存储和计算分离）</p><p>2.查询时尽量单表查询，减少跨库查询和多表关联</p><p>3.杜绝大事务、大SQL、大批量、大字段等性能杀手</p><p>大事务：运行步骤较多，涉及的表和字段较多，容易造成资源的争抢，甚至形成死锁。一旦事务回滚，会导致资源占用时间过长。</p><p>大 SQL：复杂的 SQL 意味着过多的表的关联，MySQL 数据库处理关联超过 3 张表以上的 SQL 时，占用资源多，性能低下。</p><p>大批量：意味着多条 SQL 一次性执行完成，必须确保进行充分的测试，并且在业务低峰时段或者非业务时段执行。</p><p>大字段：blob、text 等大字段，尽量少用。必须要用时，尽量与主业务表分离，减少对这类字段的检索和更新。</p><p>下面具体讲解数据库的基本设置规则：</p><ol><li>必须指定默认存储引擎为 InnoDB，并且禁用 MyISAM 存储引擎，随着 MySQL 8.0 版本的发布，所有的数据字典表都已经转换成了 InnoDB，MyISAM 存储引擎已成为了历史。</li><li>默认字符集 UTF8mb4，以前版本的 UTF8 是 UTF8mb3，未包含个别特殊字符，新版本的 UTF8mb4 包含所有字符，官方强烈建议使用此字符集。</li><li>关闭区分大小写功能。设置 lower_case_tables_name=1，即可关闭区分大小写功能，即大写字母 T 和小写字母 t 一样。</li><li>开启 per-table 表空间，开启后，每张业务表会单独创建一个独立于系统表空间的表空间，便于空间的回收，数据的迁移。</li></ol><p>这里在实践中有个小问题，如何让系统中区分大小写的库表转换为不区分大小写的库表呢？因为要修改底层数据，还是比较麻烦的，操作步骤如下：</p><p>MySQL dump 导出数据库。</p><p>修改参数 lower_case_tables_name=1。</p><p>导入备份数据时，必须停止数据库，停止业务，影响非常大。</p><h4 id="禁用功能" tabindex="-1">禁用功能 <a class="header-anchor" href="#禁用功能" aria-label="Permalink to &quot;禁用功能&quot;">​</a></h4><p>MySQL 数据库提供的功能很全面，但并不是所有的功能性能都高效。</p><p>存储过程、触发器、视图、event。为了存储计算分离，这类功能尽量在程序中实现。这些功能非常不完整，调试、排错、监控都非常困难，相关数据字典也不完善，存在潜在的风险。一般在生产数据库中，禁止使用。</p><p>lob、text、enum、set。这些字段类型，在 MySQL 数据库的检索性能不高，很难使用索引进行优化。如果必须使用这些功能，一般采取特殊的结构设计，或者与程序结合使用其他的字段类型替代。比如：set 可以使用整型（0，1，2，3）、注释功能和程序的检查功能集合替代。</p><h3 id="_2-命名规范" tabindex="-1">2 命名规范 <a class="header-anchor" href="#_2-命名规范" aria-label="Permalink to &quot;2 命名规范&quot;">​</a></h3><ul><li>名称的字符范围为：a-z,0-9和_（下划线）</li><li>所有表名小写</li><li>不允许使用-（横杠）、空格</li><li>不允许其他字符作为名称例如：@&amp;*%￥#等等</li></ul><p>库名：1位数据库类型代码+项目简称+识别代码+序号</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaPfaDVSUoJFrAzQXa5U9NpBmCgIPBxWIZR0VOicgAsMnvpiaDzoYe0YITHr2dmenXqicMZqpicY6TfvEkrqj3yRBdQ/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>表名：</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaPfaDVSUoJFrAzQXa5U9NpBmCgIPBxWITMB97mKOYIwZsam0TYzKRicqorHTx5LsjhiaGaNuvia1G0h49UMWWT8Vw/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>字段名：</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaPfaDVSUoJFrAzQXa5U9NpBmCgIPBxWI0MjnXBuhX8Qb6SoBx4egvJSxhibrL6ZahoCia2nuov5cvWBFBVhSKw1g/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><h2 id="innodb表要求" tabindex="-1">Innodb表要求 <a class="header-anchor" href="#innodb表要求" aria-label="Permalink to &quot;Innodb表要求&quot;">​</a></h2><blockquote><ul><li>主键列，UNSIGNED证书，使用auto_increment(这个如果在实际项目中不一定的，大多数不会用自增，因为在分库分表会有问题，会用雪花算法计算id)</li><li>必须添加comment注解（主要是为了方便他人理解）</li><li>必须显式指定engine（引擎）</li><li>表必备三字段：id,xxx_create,xxx_modified(主键id，创建时间，更新时间)</li></ul></blockquote><h2 id="字段设计要求" tabindex="-1">字段设计要求 <a class="header-anchor" href="#字段设计要求" aria-label="Permalink to &quot;字段设计要求&quot;">​</a></h2><p>数据值进行参考</p><blockquote><ul><li>合理的类型，最短的长度，NotNULL</li><li>表字段少而精</li><li>单表个数必须控制在2000个以内</li><li>单表分表个数必须控制在1024个以内</li><li>单表字段数上限控制在20-50</li></ul></blockquote><p>总结</p><ol><li>以高性能为目标，库表设计以范式为主，根据特殊业务场景使用反范式，允许必要的空间换时间。</li><li>规范数据库的使用原则，统一规范命名，减少性能隐患，减少隐式转换。</li><li>高性能表设计的原则：合适的字段、合适的长度、NOT NULL。</li><li>从不同角度思考 IP、timestamp 的转换，拓宽设计思路。</li><li>规范的命名可提高可读性，反范式设计可提高查询性能。</li></ol><h1 id="高性能优化规范" tabindex="-1">高性能优化规范 <a class="header-anchor" href="#高性能优化规范" aria-label="Permalink to &quot;高性能优化规范&quot;">​</a></h1><h2 id="数据库命令规范" tabindex="-1">数据库命令规范 <a class="header-anchor" href="#数据库命令规范" aria-label="Permalink to &quot;数据库命令规范&quot;">​</a></h2><p>1、所有数据库对象名称必须使用小写字母并用下划线分割；</p><p>2、所有数据库对象名称禁止使用mysql保留关键字（如果表名中包含关键字查询时，需要将其用单引号括起来）；</p><p>3、数据库对象的命名要能做到见名识意，并且最后不要超过32个字符；</p><p>4、临时库表必须以tmp_为前缀并以日期为后缀，备份表必须以bak_为前缀并以日期(时间戳)为后缀；</p><p>5、所有存储相同数据的列名和列类型必须一致（一般作为关联列，如果查询时关联列类型不一致会自动进行数据类型隐式转换，会造成列上的索引失效，导致查询效率降低）。</p><h2 id="数据库基本设计规范" tabindex="-1">数据库基本设计规范 <a class="header-anchor" href="#数据库基本设计规范" aria-label="Permalink to &quot;数据库基本设计规范&quot;">​</a></h2><h3 id="所有表必须使用innodb存储引擎" tabindex="-1">所有表必须使用Innodb存储引擎 <a class="header-anchor" href="#所有表必须使用innodb存储引擎" aria-label="Permalink to &quot;所有表必须使用Innodb存储引擎&quot;">​</a></h3><p>没有特殊要求（即Innodb无法满足的功能如：列存储，存储空间数据等）的情况下，所有表必须使用Innodb存储引擎（mysql5.5之前默认使用Myisam，5.6以后默认的为Innodb）。</p><p>Innodb 支持事务，支持行级锁，更好的恢复性，高并发下性能更好。</p><h3 id="数据库和表的字符集统一使用utf8" tabindex="-1">数据库和表的字符集统一使用UTF8 <a class="header-anchor" href="#数据库和表的字符集统一使用utf8" aria-label="Permalink to &quot;数据库和表的字符集统一使用UTF8&quot;">​</a></h3><p>兼容性更好，统一字符集可以避免由于字符集转换产生的乱码，不同的字符集进行比较前需要进行转换会造成索引失效，如果数据库中有存储emoji表情的需要，字符集需要采用utf8mb4字符集。</p><p>所有表和字段都需要添加注释</p><p>使用comment从句添加表和列的备注，从一开始就进行数据字典的维护。</p><h3 id="尽量控制单表数据量的大小-建议控制在500万以内" tabindex="-1">尽量控制单表数据量的大小，建议控制在500万以内 <a class="header-anchor" href="#尽量控制单表数据量的大小-建议控制在500万以内" aria-label="Permalink to &quot;尽量控制单表数据量的大小，建议控制在500万以内&quot;">​</a></h3><p>500万并不是Mysql数据库的限制，过大会造成修改表结构、备份、恢复都会有很大的问题。</p><p>可以用历史数据归档（应用于日志数据），分库分表（应用于业务数据）等手段来控制数据量大小。</p><h3 id="谨慎使用mysql分区表" tabindex="-1">谨慎使用MySQL分区表 <a class="header-anchor" href="#谨慎使用mysql分区表" aria-label="Permalink to &quot;谨慎使用MySQL分区表&quot;">​</a></h3><p>分区表在物理上表现为多个文件，在逻辑上表现为一个表；</p><p>谨慎选择分区键，跨分区查询效率可能更低；</p><p>建议采用物理分表的方式管理大数据。</p><h3 id="尽量做到冷热数据分离-减小表的宽度" tabindex="-1">尽量做到冷热数据分离，减小表的宽度 <a class="header-anchor" href="#尽量做到冷热数据分离-减小表的宽度" aria-label="Permalink to &quot;尽量做到冷热数据分离，减小表的宽度&quot;">​</a></h3><p>MySQL限制每个表最多存储4096列，并且每一行数据的大小不能超过65535字节；</p><p>减少磁盘IO,保证热数据的内存缓存命中率（表越宽，把表装载进内存缓冲池时所占用的内存也就越大,也会消耗更多的IO）；更有效利用缓存，避免读入无用的冷数据；经常一起使用的列放到一个表中（避免更多的关联操作）。</p><h3 id="禁止在表中建立预留字段" tabindex="-1">禁止在表中建立预留字段 <a class="header-anchor" href="#禁止在表中建立预留字段" aria-label="Permalink to &quot;禁止在表中建立预留字段&quot;">​</a></h3><p>预留字段的命名很难做到见名识义；</p><p>预留字段无法确认存储的数据类型，所以无法选择合适的类型；</p><p>对预留字段类型的修改，会对表进行锁定。</p><h3 id="禁止在数据库中存储图片-文件等大的二进制数据" tabindex="-1">禁止在数据库中存储图片，文件等大的二进制数据 <a class="header-anchor" href="#禁止在数据库中存储图片-文件等大的二进制数据" aria-label="Permalink to &quot;禁止在数据库中存储图片，文件等大的二进制数据&quot;">​</a></h3><p>通常文件很大，会短时间内造成数据量快速增长，数据库进行数据库读取时，通常会进行大量的随机IO操作，文件很大时，IO操作很耗时；</p><p>通常存储于文件服务器，数据库只存储文件地址信息。</p><p><strong>禁止在线上做数据库压力测试</strong></p><p><strong>禁止从开发环境，测试环境直接连接生成环境数据库</strong></p><h2 id="数据库字段设计规范" tabindex="-1">数据库字段设计规范 <a class="header-anchor" href="#数据库字段设计规范" aria-label="Permalink to &quot;数据库字段设计规范&quot;">​</a></h2><h3 id="优先选择符合存储需要的最小的数据类型" tabindex="-1">优先选择符合存储需要的最小的数据类型 <a class="header-anchor" href="#优先选择符合存储需要的最小的数据类型" aria-label="Permalink to &quot;优先选择符合存储需要的最小的数据类型&quot;">​</a></h3><p>原因是：列的字段越大，建立索引时所需要的空间也就越大，这样一页中所能存储的索引节点的数量也就越少也越少，在遍历时所需要的IO次数也就越多，索引的性能也就越差。</p><p>方法：<strong>将字符串转换成数字类型存储</strong></p><p>如：将IP地址转换成整型数据。mysql提供了两个方法来处理ip地址：</p><ul><li>inet_aton 把ip转为无符号整型(4-8位)</li><li>inet_ntoa 把整型的ip转为地址</li></ul><p>插入数据前，先用inet_aton把ip地址转为整型，可以节省空间，显示数据时，使用inet_ntoa把整型的ip地址转为地址显示即可。</p><ul><li><strong>对于非负型的数据（如自增ID、整型IP）来说，要优先使用无符号整型来存储</strong></li></ul><p>因为：无符号相对于有符号可以多出一倍的存储空间：</p><ul><li>SIGNED INT -2147483648~2147483647</li><li>UNSIGNED INT 0~4294967295</li></ul><p>VARCHAR(N)中的N代表的是字符数，而不是字节数，使用UTF8存储255个汉字 Varchar(255)=765个字节，过大的长度会消耗更多的内存。</p><h3 id="避免使用text、blob数据类型-最常见的text类型可以存储64k的数据" tabindex="-1">避免使用TEXT、BLOB数据类型，最常见的TEXT类型可以存储64k的数据 <a class="header-anchor" href="#避免使用text、blob数据类型-最常见的text类型可以存储64k的数据" aria-label="Permalink to &quot;避免使用TEXT、BLOB数据类型，最常见的TEXT类型可以存储64k的数据&quot;">​</a></h3><ul><li><strong>建议把BLOB或是TEXT列分离到单独的扩展表中</strong></li></ul><p>Mysql内存临时表不支持TEXT、BLOB这样的大数据类型，如果查询中包含这样的数据，在排序等操作时，就不能使用内存临时表，必须使用磁盘临时表进行。</p><p>而且对于这种数据，Mysql还是要进行二次查询，会使sql性能变得很差，但是不是说一定不能使用这样的数据类型。如果一定要使用，建议把BLOB或是TEXT列分离到单独的扩展表中，查询时一定不要使用select * 而只需要取出必要的列，不需要TEXT列的数据时不要对该列进行查询。</p><ul><li><strong>TEXT或BLOB类型只能使用前缀索引</strong></li></ul><p>因为MySQL对索引字段长度是有限制的，所以TEXT类型只能使用前缀索引，并且TEXT列上是不能有默认值的。</p><h3 id="避免使用enum类型" tabindex="-1">避免使用ENUM类型 <a class="header-anchor" href="#避免使用enum类型" aria-label="Permalink to &quot;避免使用ENUM类型&quot;">​</a></h3><ul><li>修改ENUM值需要使用ALTER语句；</li><li>ENUM类型的ORDER BY操作效率低，需要额外操作；</li><li>禁止使用数值作为ENUM的枚举值。</li></ul><h3 id="尽可能把所有列定义为not-null" tabindex="-1">尽可能把所有列定义为NOT NULL <a class="header-anchor" href="#尽可能把所有列定义为not-null" aria-label="Permalink to &quot;尽可能把所有列定义为NOT NULL&quot;">​</a></h3><p>索引NULL列需要额外的空间来保存，所以要占用更多的空间，进行比较和计算时要对NULL值做特别的处理。</p><p><strong>使用TIMESTAMP（4个字节）或DATETIME类型（8个字节）存储时间</strong></p><p>TIMESTAMP 存储的时间范围 1970-01-01 00:00:01 ~ 2038-01-19-03:14:07。</p><p>TIMESTAMP 占用4字节和INT相同，但比INT可读性高，超出TIMESTAMP取值范围的使用DATETIME类型存储。</p><p>经常会有人用字符串存储日期型的数据（不正确的做法）：</p><p>缺点1：无法用日期函数进行计算和比较；</p><p>缺点2：用字符串存储日期要占用更多的空间。</p><h3 id="同财务相关的金额类数据必须使用decimal类型" tabindex="-1">同财务相关的金额类数据必须使用decimal类型 <a class="header-anchor" href="#同财务相关的金额类数据必须使用decimal类型" aria-label="Permalink to &quot;同财务相关的金额类数据必须使用decimal类型&quot;">​</a></h3><ul><li>非精准浮点：float,double</li><li>精准浮点：decimal</li></ul><p>Decimal类型为精准浮点数，在计算时不会丢失精度，占用空间由定义的宽度决定，每4个字节可以存储9位数字，并且小数点要占用一个字节，可用于存储比bigint更大的整型数据。</p><h1 id="数据库设计的-10-个最佳实践" tabindex="-1">数据库设计的 10 个最佳实践 <a class="header-anchor" href="#数据库设计的-10-个最佳实践" aria-label="Permalink to &quot;数据库设计的 10 个最佳实践&quot;">​</a></h1><p>数据库是应用及计算机的核心元素，负责存储运行软件应用所需的一切重要数据。为了保障应用正常运行，总有一个甚至多个数据库在默默运作。我们可以把数据库视为信息仓库，以结构化的方式存储了大量的相关信息，并合理分类，方便搜索及使用。</p><p>因此，数据库设计成为软件开发中的重要一环，对于开发者来说，设计一个高效的数据库至关重要。那么，为什么数据库设计很重要，“好”的标准又是什么？本文将做以介绍。</p><h2 id="为什么数据库设计很重要" tabindex="-1">为什么数据库设计很重要？ <a class="header-anchor" href="#为什么数据库设计很重要" aria-label="Permalink to &quot;为什么数据库设计很重要？&quot;">​</a></h2><p>用我们订购衬衫的在线商城网站举例。如今，从网站上订购衬衫的过程似乎很简单，但涉及了很多信息交换。例如：第一次浏览网页时，系统会展示给你一系列信息，包含产品分类，所有可用商品、相应价格、可用尺码、颜色以及其他相关信息。</p><p>网站会从存储数据的数据库中检索，当用户选中所需商品并继续操作购买时，网站会询问个人详细信息、送货地址、付款详细信息，并确认订单。目前在此过程中产生的新数据，如用户详细信息、订单详细信息、购买及付款都会在同一个数据库中添加及更新。</p><p>数据库设计很重要，因为对构建可伸缩且能够在高工作负载下运行的软件应用来说，它是至关重要的。设计数据库首先来说，选择数据库软件很关键。目前可用于构建应用的数据库软件有数百种可供选择，我们可以从一些最好的免费数据库软件中选择，之后便是设计符合要求的数据库了。下面列出了10个最优的数据库设计实践。</p><h2 id="数据库设计的10个最佳实践" tabindex="-1">数据库设计的10个最佳实践 <a class="header-anchor" href="#数据库设计的10个最佳实践" aria-label="Permalink to &quot;数据库设计的10个最佳实践&quot;">​</a></h2><h3 id="_1、将所有人的观点列入考量" tabindex="-1">1、<strong>将所有人的观点列入考量</strong> <a class="header-anchor" href="#_1、将所有人的观点列入考量" aria-label="Permalink to &quot;1、**将所有人的观点列入考量**&quot;">​</a></h3><blockquote><p>要设计好的数据库，必须考虑所有相关利益者的观点。在构建数据库之前，先去收集信息，了解他们对数据库的期望以及对数据库的操作熟练度。这样就能得出数据库应当采用的技术水平，以及是否要就数据库的功能来训练用户。</p></blockquote><h3 id="_2、选择符合需求的数据库类型" tabindex="-1">2、选择符合需求的数据库类型 <a class="header-anchor" href="#_2、选择符合需求的数据库类型" aria-label="Permalink to &quot;2、选择符合需求的数据库类型&quot;">​</a></h3><blockquote><p>数据库有多种类型，选择正确类型则是数据库设计的关键。我们可以将数据库以两种方式分类。一是基于数据库用以定义和操作数据的查询语言。使用SQL的数据库是结构化数据最常用的类型。然而，由于NoSQL数据库的可伸缩性、灵活性和速度更优，它们更适合机器学习、网络分析以及物联网（IoT）使用。</p></blockquote><blockquote><p>第二种分类方式则是基于数据模型。这样分类会有四种类型：**关系数据库、分层数据库、网络数据库以及面向对象的数据库。研究数据库的不同类型，并针对应用需求作出选择，这是必要的初始步骤。</p></blockquote><h3 id="_3、以一致的方式来定义与标记表和列" tabindex="-1">3、以一致的方式来定义与标记表和列 <a class="header-anchor" href="#_3、以一致的方式来定义与标记表和列" aria-label="Permalink to &quot;3、以一致的方式来定义与标记表和列&quot;">​</a></h3><blockquote><p>在定义数据项以及标记表与列时，遵从一致性原则非常重要，可以帮助我们更好地理解数据。命名表与列的最佳实践之一便是使用简单的名字来定义其包含的数据。比如：只需将包含用户名称的列标记为“CustomerName”（“用户名”）即可。应当避免使用复数名（如CustomerNames）、缩写（如CN），并且名称中不得使用空格（如Customer Name）。如果坚持遵守这些规则，则将来的用户在使用数据库时会更容易。</p></blockquote><h3 id="_4、规范化是关键" tabindex="-1">4、规范化是关键 <a class="header-anchor" href="#_4、规范化是关键" aria-label="Permalink to &quot;4、规范化是关键&quot;">​</a></h3><p>数据库的规范化指的是将数据库中的所有信息组织起来，避免数据重复和冗余。简单来说，规范化是将数据打散分配到多个较小的相关表中，而不是统统存在一个大表里。《<a href="http://mp.weixin.qq.com/s?__biz=MzI3ODcxMzQzMw==&amp;mid=2247486173&amp;idx=2&amp;sn=0603756b36279b5f5f036151af85f9fd&amp;chksm=eb538febdc2406fd70748604c500eeaea584306c137cb2020ab5a72187c9359926015e00a46d&amp;scene=21#wechat_redirect" target="_blank" rel="noreferrer"><em>MySQL数据库开发的 36 条军规！</em>》</a>建议你看下。</p><p>将数据规范化是很好的数据库设计实践，有助于提高效率。但是请确保不要过度规范化，否则将会把数据分散到太多的小表中，反而造成混乱。</p><h3 id="_5、数据库设计的文档化很重要" tabindex="-1">5、数据库设计的文档化很重要 <a class="header-anchor" href="#_5、数据库设计的文档化很重要" aria-label="Permalink to &quot;5、数据库设计的文档化很重要&quot;">​</a></h3><blockquote><p>事实上，文档化并非人见人爱，因为实在太烦了。但要记得，文档化对于良好的数据库设计至关重要，可以追踪所有的小细节。数据库设计应当附有指示说明、ER图、存储过程及所有其他相关的信息。文档还应当为编程者和终端用户提供足够信息量，确保他们能够理解并使用。</p></blockquote><h3 id="_6、隐私是首要考量" tabindex="-1">6、隐私是首要考量 <a class="header-anchor" href="#_6、隐私是首要考量" aria-label="Permalink to &quot;6、隐私是首要考量&quot;">​</a></h3><blockquote><p>很多时候，存储在数据库中的信息是加密信息，隐私就成了一个值得关注的问题。为了获得最大程度的安全性，我们应当对密码加密，使用身份验证来限制数据库的访问，并使用另一个服务器来存放数据库，而不是应用所在的服务器。这将确保你的数据不受攻击和隐私侵犯的威胁。</p></blockquote><h3 id="_7、考虑长期需求" tabindex="-1">7、考虑长期需求 <a class="header-anchor" href="#_7、考虑长期需求" aria-label="Permalink to &quot;7、考虑长期需求&quot;">​</a></h3><blockquote><p>优秀的数据库设计应当具备可伸缩性，即：在使用量增加的情况下，仍然能承受较高的工作负载，并保障应用的运行。对工作量可能会有所改变的企业来说，在设计数据库时牢记此项至关重要。</p></blockquote><blockquote><p>例如：如果一个电子商务网站预计当销售量增长时，访客会在一个月内急速增加，那么在设计数据库时应当将这一点列入考量，以便数据库可以响应迅速增长的访客，并保持在高工作负载的情况下运作。</p></blockquote><h3 id="_8、代码以及使用预存程序" tabindex="-1">8、代码以及使用预存程序 <a class="header-anchor" href="#_8、代码以及使用预存程序" aria-label="Permalink to &quot;8、代码以及使用预存程序&quot;">​</a></h3><blockquote><p>数据库设计中的常见错误之一，就是不使用预存程序。预存程序指的是，在操作数据时手边随时可用的提前预存代码串。例如，如果有个SQL查询是常用的操作指令，则将它提前写入预存程序，而不是在用的时候重新来写，就会让工作简单起来。一旦有了预存程序，就可以在需要时一步执行并载入这个SQL查询了。</p></blockquote><blockquote><p>编写大量预存程序是个吃力的工作，但如果花时间完成并用文档记录下来的话，对终端用户来说，使用数据库就更加轻松了。</p></blockquote><h3 id="_9、在数据库建模和设计上投入时间" tabindex="-1">9、在数据库建模和设计上投入时间 <a class="header-anchor" href="#_9、在数据库建模和设计上投入时间" aria-label="Permalink to &quot;9、在数据库建模和设计上投入时间&quot;">​</a></h3><blockquote><p>优秀数据库设计的专业技巧之一是在数据库建模和设计上投入时间和精力。开发者常见的错误就是忽略这一步以节省时间，将重点放在软件开发更重要的其他方面上。</p></blockquote><blockquote><p>但是，数据库设计对于保障应用的功能来说非常关键。如果一味想节省时间，不仔细思考设计的话，未来就会需要花费更多时间来维护数据库，甚至重新设计。</p></blockquote><h3 id="_10、测试设计" tabindex="-1">10、测试设计 <a class="header-anchor" href="#_10、测试设计" aria-label="Permalink to &quot;10、测试设计&quot;">​</a></h3><blockquote><p>测试也是数据库设计很关键的步骤，而且经常会被疏忽对待，甚至完全跳过，只为了赶DDL。我们应当在发布项目前，花些时间来彻底测试数据库设计，以确保其满足了所有计划中的需求，且正常运行。</p></blockquote></div></div></main><footer class="VPDocFooter" data-v-6b87e69f data-v-37656e44><!--[--><!--]--><!----><nav class="prev-next" data-v-37656e44><div class="pager" data-v-37656e44><a class="pager-link prev" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/MySQL/MySQL%E6%A0%B8%E5%BF%83/%E4%BC%98%E5%8C%96.html" data-v-37656e44><span class="desc" data-v-37656e44>Previous page</span><span class="title" data-v-37656e44>MySQL优化</span></a></div><div class="pager" data-v-37656e44><a class="pager-link next" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/MySQL/MySQL%E6%A0%B8%E5%BF%83/%E8%BF%90%E7%BB%B4.html" data-v-37656e44><span class="desc" data-v-37656e44>Next page</span><span class="title" data-v-37656e44>MySQL运维</span></a></div></nav></footer><!--[--><!--]--></div></div></div><!--[--><!--]--></div></div><!----><!--[--><!--]--></div></div>
    <script>window.__VP_HASH_MAP__=JSON.parse("{\"2、数据库_mysql_mysql面试_基础.md\":\"40da680a\",\"1、学前端_5、小程序_小程序项目.md\":\"60a1629b\",\"1、学前端_4、node_知识篇.md\":\"a7fb500e\",\"1、学前端_2、js_ts_es6 进阶.md\":\"6d07ba10\",\"1、学前端_3、vue_vue3_vue3进阶.md\":\"7ac622b4\",\"5、运维_jenkins.md\":\"929081f8\",\"1、学前端_2、js_ts_typescript.md\":\"875a4aa4\",\"2、数据库_mysql_mysql核心_设计.md\":\"7faf46d1\",\"2、数据库_mysql_mysql核心_基础.md\":\"d8e97f3e\",\"1、学前端_1、html_css_html基础.md\":\"7584d076\",\"1、学前端_5、专题篇_问题篇.md\":\"e893aaa2\",\"2、数据库_mysql_mysql面试_进阶.md\":\"f934806d\",\"3、springboot_运维_原理.md\":\"f4a39db6\",\"2、数据库_influxdb.md\":\"6e1711e1\",\"3、springboot_新特性.md\":\"cdf3e307\",\"mybatis_mybatisplus_jpa.md\":\"8e41681b\",\"1、学前端_5、小程序_小程序优化.md\":\"a2185198\",\"2、数据库_redis_redis基础.md\":\"856df0e0\",\"linux_实用脚本.md\":\"f2299dd5\",\"4、微服务_必备_分布式基础.md\":\"d49863d5\",\"2、数据库_redis_redis优化.md\":\"e66ae32f\",\"4、微服务_springsecurity_进阶篇.md\":\"235a8e9e\",\"5、运维_chatgpt.md\":\"10db3823\",\"2、数据库_mysql_分库分表.md\":\"e1c8a095\",\"start.md\":\"9bc1ff8d\",\"5、运维_github.md\":\"2ec6c735\",\"java学前端_css.md\":\"f11b47f0\",\"1、学前端_5、专题篇_知识篇.md\":\"a463ed8d\",\"linux_软件部署.md\":\"d6722925\",\"2、数据库_neo4j.md\":\"97ad22ac\",\"team.md\":\"ce467a6a\",\"nginx_实战篇.md\":\"7785486e\",\"index.md\":\"8c3ec167\",\"计算机基础_计算机网络_网络基础.md\":\"7a54a85d\",\"1、学前端_4、node_进阶篇.md\":\"60f6db69\",\"java_java集合.md\":\"a049b313\",\"1、学前端_3、vue_vue3_vue3高级.md\":\"614d1516\",\"1、学前端_5、小程序_微信小程序.md\":\"9a4be771\",\"5、运维_netty.md\":\"12ca0278\",\"2、数据库_mysql_mysql核心_运维.md\":\"83f97c16\",\"idea_vs code.md\":\"afdcb593\",\"java学前端_vue3_组件.md\":\"1086884e\",\"idea_chrome.md\":\"4a32afbc\",\"云原生_k8s.md\":\"db58e65a\",\"2、数据库_mysql_mysql核心_进阶.md\":\"61d16dff\",\"ssm_springbatch.md\":\"f799ab4a\",\"三高_分布式.md\":\"db1b8a1b\",\"2、数据库_elasticsearch_1、es基础.md\":\"04d17448\",\"linux_linux基础.md\":\"4b0bf394\",\"idea_idea插件.md\":\"fa86e45a\",\"可视化 _ 监控_可视化大屏.md\":\"004553bd\",\"2、数据库_mongodb_整合.md\":\"3c47d7f4\",\"4、微服务_springsecurity_基础篇.md\":\"534a3401\",\"4、微服务_进阶.md\":\"69095c58\",\"计算机基础_计算机基础_操作系统.md\":\"0f75d113\",\"可视化 _ 监控_zabbix.md\":\"71f2270e\",\"nginx_基础篇.md\":\"c7d8bb50\",\"1、学前端_4、node_项目实战.md\":\"bc5065b8\",\"2、数据库_redis_redis原理.md\":\"5cedf685\",\"可视化 _ 监控_监控基础.md\":\"ac56ce4d\",\"三高_高并发.md\":\"ea9ffc99\",\"2、数据库_redis_redis高级.md\":\"1d5872f6\",\"1、学前端_4、node_基础篇.md\":\"581cc13a\",\"2、数据库_mongodb_基础.md\":\"fb7a0a29\",\"idea_idea基础.md\":\"6f2f9638\",\"4、微服务_必备_sentinel.md\":\"2edfbf6c\",\"2、数据库_elasticsearch_3、es高级.md\":\"ef146606\",\"1、学前端_3、vue_vue3_vue3新语法.md\":\"8afd5409\",\"消息中间件_canal.md\":\"3949163c\",\"ssm_maven.md\":\"2c5e12ed\",\"4、微服务_springsecurity_高级篇.md\":\"882d3ff3\",\"linux_linux进阶.md\":\"188ef7b4\",\"计算机基础_设计模式_uml.md\":\"634ba256\",\"计算机基础_算法_leetcode.md\":\"77162fb9\",\"项目实战_小兔鲜_进阶篇1.md\":\"17c52c81\",\"1、学前端_2、js_ts_es6 基础.md\":\"fda3f18b\",\"项目实战_小兔鲜_进阶篇2.md\":\"a0f23006\",\"软件测试_测试基础.md\":\"8c1060cd\",\"2、数据库_redis_本地缓存.md\":\"00617fe6\",\"nginx_面试篇.md\":\"e3fb373a\",\"mybatis_mybatisplus_mybatis.md\":\"9239e0ad\",\"linux_shell.md\":\"ae53d83b\",\"2、数据库_mysql_mysql核心_优化.md\":\"36230425\",\"项目实战_项目推荐.md\":\"f9d97630\",\"mybatis_mybatisplus_mybatisplus.md\":\"0030fd35\",\"项目实战_百度地图_进阶篇.md\":\"c8b93267\",\"三高_高可用.md\":\"323840c5\",\"java_java新特性.md\":\"22abf56d\",\"软件测试_压力测试.md\":\"9ab44440\",\"java学前端_html_js.md\":\"e0fcd240\",\"2、数据库_redis_redis实战.md\":\"d6daeeab\",\"nginx_进阶篇.md\":\"e6b63195\",\"三高_秒杀.md\":\"3878bb64\",\"5、运维_git.md\":\"0264925c\",\"java_java进阶.md\":\"e79cb5b4\",\"并发 _ 多线程_基础篇.md\":\"7adbfac5\",\"项目实战_百度地图_基础篇.md\":\"8afa5954\",\"java学前端_react.md\":\"3ec827dd\",\"1、学前端_1、html_css_css基础.md\":\"01b56712\",\"项目实战_小兔鲜_基础篇.md\":\"646f5df5\",\"1、学前端_2、js_ts_js 基础.md\":\"cb13e36f\",\"可视化 _ 监控_监控进阶.md\":\"0cdbc292\",\"计算机基础_设计模式_基础篇.md\":\"51617287\",\"计算机基础_数据结构_基础篇.md\":\"b2bfd8d4\",\"项目实战_苍穹外卖_进阶篇.md\":\"48415e41\",\"ssm_spring.md\":\"ab514659\",\"消息中间件_rabbitmq.md\":\"45b1eb28\",\"1、学前端_1、html_css_网页进阶.md\":\"db998248\",\"消息中间件_kafka.md\":\"b747dabf\",\"云原生_docker.md\":\"983c7ba7\",\"4、微服务_必备_分布式锁.md\":\"5af1cf8d\",\"消息中间件_rocketmq.md\":\"d441da85\",\"项目实战_黑马头条_基础篇.md\":\"b05af3a6\",\"ssm_springmvc.md\":\"81b9714f\",\"项目实战_支付.md\":\"1d7407dd\",\"项目实战_黑马头条_进阶篇2.md\":\"bff0015b\",\"项目实战_黑马头条_进阶篇.md\":\"19f18388\",\"java学前端_vue2_组件.md\":\"58c6b1df\",\"3、springboot_基础篇.md\":\"529c66f4\",\"3、springboot_应用篇.md\":\"8b92aa61\",\"项目实战_黑马头条_高级篇.md\":\"227c08c1\",\"1、学前端_5、小程序_uniapp.md\":\"71a282b4\",\"项目实战_云尚办公_基础篇.md\":\"1fe188ba\",\"并发 _ 多线程_并发完善.md\":\"26619c46\",\"1、学前端_2、js_ts_js 进阶.md\":\"657dfb8f\",\"java_java高级.md\":\"23782d1a\",\"java_java基础.md\":\"86d67c77\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"VitePress\",\"description\":\"A VitePress site\",\"base\":\"/notebook/\",\"head\":[],\"appearance\":true,\"themeConfig\":{\"algolia\":{\"appId\":\"DW7O63I9IR\",\"apiKey\":\"f8ed758cdb288a8b06542bc35923c1a1\",\"indexName\":\"notebook\"},\"sidebar\":[{\"text\":\"Java\",\"collapsed\":true,\"items\":[{\"text\":\"Java基础\",\"link\":\"/Java/Java基础\"},{\"text\":\"Java新特性\",\"link\":\"/Java/Java新特性\"},{\"text\":\"Java进阶\",\"link\":\"/Java/Java进阶\"},{\"text\":\"Java集合\",\"link\":\"/Java/Java集合\"},{\"text\":\"Java高级\",\"link\":\"/Java/Java高级\"}]},{\"text\":\"Linux\",\"collapsed\":true,\"items\":[{\"text\":\"Linux基础\",\"link\":\"/Linux/Linux基础\"},{\"text\":\"Linux新特性\",\"link\":\"/Linux/Linux进阶\"},{\"text\":\"Shell脚本\",\"link\":\"/Linux/Shell\"},{\"text\":\"实用脚本\",\"link\":\"/Linux/实用脚本\"},{\"text\":\"软件部署\",\"link\":\"/Linux/软件部署\"}]},{\"text\":\"Nginx\",\"collapsed\":true,\"items\":[{\"text\":\"基础篇\",\"link\":\"/Nginx/基础篇\"},{\"text\":\"进阶篇\",\"link\":\"/Nginx/进阶篇\"},{\"text\":\"实战篇\",\"link\":\"/Nginx/实战篇\"},{\"text\":\"面试篇\",\"link\":\"/Nginx/面试篇\"}]},{\"text\":\"SSM\",\"collapsed\":true,\"items\":[{\"text\":\"Maven\",\"link\":\"/SSM/Maven\"},{\"text\":\"Spring\",\"link\":\"/SSM/Spring\"},{\"text\":\"SpringMVC\",\"link\":\"/SSM/SpringMVC\"},{\"text\":\"SpringBatch\",\"link\":\"/SSM/SpringBatch\"}]},{\"text\":\"SpringBoot\",\"collapsed\":true,\"items\":[{\"text\":\"基础篇\",\"link\":\"/3、SpringBoot/基础篇\"},{\"text\":\"应用篇\",\"link\":\"/3、SpringBoot/应用篇\"},{\"text\":\"新特性\",\"link\":\"/3、SpringBoot/新特性\"},{\"text\":\"运维&原理\",\"link\":\"/3、SpringBoot/运维&原理\"}]},{\"text\":\"SpringCloud\",\"collapsed\":true,\"items\":[{\"text\":\"SpringCloud\",\"link\":\"/4、微服务/进阶\"},{\"text\":\"Sentinel\",\"link\":\"/4、微服务/必备/Sentinel\"}]},{\"text\":\"SpringSecurity\",\"collapsed\":true,\"items\":[{\"text\":\"SpringSecurity基础篇\",\"link\":\"/4、微服务/SpringSecurity/基础篇\"},{\"text\":\"SpringSecurity进阶篇\",\"link\":\"/4、微服务/SpringSecurity/进阶篇\"},{\"text\":\"SpringSecurity高级篇\",\"link\":\"/4、微服务/SpringSecurity/高级篇\"}]},{\"text\":\"Mybatis & MybatisPlus\",\"collapsed\":true,\"items\":[{\"text\":\"Mybatis\",\"link\":\"/Mybatis&MybatisPlus/Mybatis\"},{\"text\":\"MybatisPlus\",\"link\":\"/Mybatis&MybatisPlus/MybatisPlus\"},{\"text\":\"JPA\",\"link\":\"/Mybatis&MybatisPlus/JPA\"}]},{\"text\":\"Git & ChatGPT\",\"collapsed\":true,\"items\":[{\"text\":\"Git\",\"link\":\"/5、运维/Git\"},{\"text\":\"Github\",\"link\":\"/5、运维/Github\"},{\"text\":\"ChatGPT\",\"link\":\"/5、运维/ChatGPT\"},{\"text\":\"Jenkins\",\"link\":\"/5、运维/Jenkins\"},{\"text\":\"Netty\",\"link\":\"/5、运维/Netty\"}]},{\"text\":\"数据库\",\"collapsed\":true,\"items\":[{\"text\":\"MySQL\",\"collapsed\":true,\"items\":[{\"text\":\"MySQL基础\",\"link\":\"/2、数据库/MySQL/MySQL核心/基础\"},{\"text\":\"MySQL进阶\",\"link\":\"/2、数据库/MySQL/MySQL核心/进阶\"},{\"text\":\"MySQL优化\",\"link\":\"/2、数据库/MySQL/MySQL核心/优化\"},{\"text\":\"MySQL设计\",\"link\":\"/2、数据库/MySQL/MySQL核心/设计\"},{\"text\":\"MySQL运维\",\"link\":\"/2、数据库/MySQL/MySQL核心/运维\"},{\"text\":\"分库分表\",\"link\":\"/2、数据库/MySQL/分库分表\"}]},{\"text\":\"Redis\",\"collapsed\":true,\"items\":[{\"text\":\"Redis基础\",\"link\":\"/2、数据库/Redis/Redis基础\"},{\"text\":\"Redis优化\",\"link\":\"/2、数据库/Redis/Redis优化\"},{\"text\":\"Redis原理\",\"link\":\"/2、数据库/Redis/Redis原理\"},{\"text\":\"Redis高级\",\"link\":\"/2、数据库/Redis/Redis高级\"},{\"text\":\"Redis实战\",\"link\":\"/2、数据库/Redis/Redis实战\"},{\"text\":\"本地缓存\",\"link\":\"/2、数据库/Redis/本地缓存\"}]},{\"text\":\"MongoDB\",\"collapsed\":true,\"items\":[{\"text\":\"MongoDB基础\",\"link\":\"/2、数据库/MongoDB/基础\"},{\"text\":\"MongoDB进阶\",\"link\":\"/2、数据库/MongoDB/整合\"}]},{\"text\":\"ElasticSearch\",\"collapsed\":true,\"items\":[{\"text\":\"ES基础\",\"link\":\"/2、数据库/ElasticSearch/1、ES基础\"},{\"text\":\"ES高级\",\"link\":\"/2、数据库/ElasticSearch/3、ES高级\"}]},{\"text\":\"InfluxDB\",\"link\":\"/2、数据库/influxdb\"},{\"text\":\"Neo4j\",\"link\":\"/2、数据库/Neo4j\"}]},{\"text\":\"高并发 & 秒杀 & 分布式\",\"collapsed\":true,\"items\":[{\"text\":\"分布式理论\",\"link\":\"/三高/分布式\"},{\"text\":\"分布式锁\",\"link\":\"/4、微服务/必备/分布式锁\"},{\"text\":\"秒杀\",\"link\":\"/三高/秒杀\"},{\"text\":\"高可用\",\"link\":\"/三高/高可用\"},{\"text\":\"高并发\",\"link\":\"/三高/高并发\"}]},{\"text\":\"云原生\",\"collapsed\":true,\"items\":[{\"text\":\"Docker\",\"link\":\"/云原生/Docker\"},{\"text\":\"K8S\",\"link\":\"/云原生/K8S\"}]},{\"text\":\"可视化 & 监控\",\"collapsed\":true,\"items\":[{\"text\":\"监控基础\",\"link\":\"/可视化 & 监控/监控基础\"},{\"text\":\"监控进阶\",\"link\":\"/可视化 & 监控/监控进阶\"},{\"text\":\"可视化大屏\",\"link\":\"/可视化 & 监控/可视化大屏\"},{\"text\":\"Zabbix\",\"link\":\"/可视化 & 监控/Zabbix\"}]},{\"text\":\"学前端\",\"collapsed\":true,\"items\":[{\"text\":\"HTML+CSS\",\"collapsed\":true,\"items\":[{\"text\":\"HTML基础\",\"link\":\"/1、学前端/1、HTML+CSS/HTML基础\"},{\"text\":\"CSS基础\",\"link\":\"/1、学前端/1、HTML+CSS/CSS基础\"},{\"text\":\"网页进阶\",\"link\":\"/1、学前端/1、HTML+CSS/网页进阶\"}]},{\"text\":\"JS+TS\",\"collapsed\":true,\"items\":[{\"text\":\"JS基础\",\"link\":\"/1、学前端/2、JS+TS/JS 基础\"},{\"text\":\"JS进阶\",\"link\":\"/1、学前端/2、JS+TS/JS 进阶\"},{\"text\":\"ES6基础\",\"link\":\"/1、学前端/2、JS+TS/ES6 基础\"},{\"text\":\"ES6进阶\",\"link\":\"/1、学前端/2、JS+TS/ES6 进阶\"},{\"text\":\"TS基础\",\"link\":\"/1、学前端/2、JS+TS/TypeScript\"}]},{\"text\":\"NodeJS\",\"collapsed\":true,\"items\":[{\"text\":\"Node基础\",\"link\":\"/1、学前端/4、Node/基础篇\"},{\"text\":\"Node进阶\",\"link\":\"/1、学前端/4、Node/进阶篇\"},{\"text\":\"项目实战\",\"link\":\"/1、学前端/4、Node/项目实战\"}]},{\"text\":\"Vue\",\"collapsed\":true,\"items\":[{\"text\":\"Vue3进阶\",\"link\":\"/1、学前端/3、Vue/Vue3/Vue3进阶\"},{\"text\":\"Vue3高级\",\"link\":\"/1、学前端/3、Vue/Vue3/Vue3高级\"},{\"text\":\"Vue3新语法\",\"link\":\"/1、学前端/3、Vue/Vue3/Vue3新语法\"},{\"text\":\"项目实战\",\"link\":\"/1、学前端/3、Vue/Vue2/Vue2项目\"}]},{\"text\":\"小程序\",\"collapsed\":true,\"items\":[{\"text\":\"小程序基础\",\"link\":\"/1、学前端/5、小程序/微信小程序\"},{\"text\":\"小程序优化\",\"link\":\"/1、学前端/5、小程序/小程序优化\"},{\"text\":\"uniapp\",\"link\":\"/1、学前端/5、小程序/uniapp\"},{\"text\":\"项目实战\",\"link\":\"/1、学前端/5、小程序/小程序项目\"}]}]},{\"text\":\"计算机基础\",\"collapsed\":true,\"items\":[{\"text\":\"数据结构\",\"link\":\"/计算机基础/数据结构/基础篇\"},{\"text\":\"操作系统\",\"link\":\"/计算机基础/计算机基础/操作系统\"},{\"text\":\"设计模式\",\"link\":\"/计算机基础/设计模式/基础篇\"},{\"text\":\"计算机网络\",\"link\":\"/计算机基础/计算机网络/网络基础\"},{\"text\":\"UML\",\"link\":\"/计算机基础/设计模式/UML\"},{\"text\":\"LeetCode\",\"link\":\"/计算机基础/算法/LeetCode\"}]},{\"text\":\"项目实战\",\"collapsed\":true,\"items\":[{\"text\":\"云尚办公\",\"collapsed\":true,\"items\":[{\"text\":\"基础篇\",\"link\":\"/项目实战/云尚办公/基础篇\"}]},{\"text\":\"小兔鲜\",\"collapsed\":true,\"items\":[{\"text\":\"基础篇\",\"link\":\"/项目实战/小兔鲜/基础篇\"},{\"text\":\"进阶篇1\",\"link\":\"/项目实战/小兔鲜/进阶篇1\"},{\"text\":\"进阶篇2\",\"link\":\"/项目实战/小兔鲜/进阶篇2\"}]},{\"text\":\"地图\",\"collapsed\":true,\"items\":[{\"text\":\"基础篇\",\"link\":\"/项目实战/百度地图/基础篇\"},{\"text\":\"进阶篇\",\"link\":\"/项目实战/百度地图/进阶篇\"}]},{\"text\":\"苍穹外卖\",\"collapsed\":true,\"items\":[{\"text\":\"进阶篇\",\"link\":\"/项目实战/苍穹外卖/进阶篇\"}]},{\"text\":\"黑马头条\",\"collapsed\":true,\"items\":[{\"text\":\"基础篇\",\"link\":\"/项目实战/黑马头条/基础篇\"},{\"text\":\"进阶篇\",\"link\":\"/项目实战/黑马头条/进阶篇\"},{\"text\":\"进阶篇2\",\"link\":\"/项目实战/黑马头条/进阶篇2\"},{\"text\":\"高级篇\",\"link\":\"/项目实战/黑马头条/高级篇\"}]},{\"text\":\"支付\",\"link\":\"/项目实战/支付\"},{\"text\":\"项目推荐\",\"link\":\"/项目实战/项目推荐\"}]},{\"text\":\"团队成员\",\"link\":\"/team\"}],\"siteTitle\":\"任硕的文档\",\"logo\":\"/Vue.png\",\"nav\":[{\"text\":\"Java学前端\",\"items\":[{\"items\":[{\"text\":\"HTML+JS\",\"link\":\"/Java学前端/HTML+JS\"},{\"text\":\"CSS\",\"link\":\"/Java学前端/CSS\"},{\"text\":\"Vue2+组件\",\"link\":\"/Java学前端/Vue2+组件\"},{\"text\":\"Vue3+组件\",\"link\":\"/Java学前端/Vue3+组件\"},{\"text\":\"React\",\"link\":\"/Java学前端/React\"}]}],\"activeMatch\":\"/Java/\"},{\"text\":\"软件测试\",\"items\":[{\"items\":[{\"text\":\"测试基础\",\"link\":\"/软件测试/测试基础\"},{\"text\":\"压力测试\",\"link\":\"/软件测试/压力测试\"}]}]},{\"text\":\"多线程\",\"items\":[{\"items\":[{\"text\":\"基础篇\",\"link\":\"/并发 & 多线程/基础篇\"},{\"text\":\"进阶篇\",\"link\":\"/并发 & 多线程/并发完善\"}]}]},{\"text\":\"开发工具\",\"items\":[{\"items\":[{\"text\":\"Chrome\",\"link\":\"/IDEA/Chrome\"},{\"text\":\"IDEA基础\",\"link\":\"/IDEA/IDEA基础\"},{\"text\":\"IDEA插件\",\"link\":\"/IDEA/IDEA插件\"},{\"text\":\"VS Code\",\"link\":\"/IDEA/VS Code\"}]}]},{\"text\":\"消息中间件\",\"items\":[{\"items\":[{\"text\":\"RabbitMQ\",\"link\":\"/消息中间件/RabbitMQ\"},{\"text\":\"RocketMQ\",\"link\":\"/消息中间件/RocketMQ\"},{\"text\":\"Kafka\",\"link\":\"/消息中间件/Kafka\"},{\"text\":\"Canal\",\"link\":\"/消息中间件/Canal\"}]}]}],\"socialLinks\":[{\"icon\":\"github\",\"link\":\"https://github.com/renshuo123/renshuo123.github.io\"},{\"icon\":\"twitter\",\"link\":\"#\"},{\"icon\":{\"svg\":\"<svg t=\\\"1676028692954\\\" class=\\\"icon\\\" ...</path></svg>\"},\"link\":\"https://github.com/\"}]},\"locales\":{},\"scrollOffset\":90,\"cleanUrls\":false}");</script>
    
  </body>
</html>